分类 SQL 下的文章

SQL Server获取某个日期范围的日期/月份数据

很多时候做图形报表,需要得到某一个日期范围内的每日或每月的数据走势。SQL的写法通常都要先把这个日期范围内的每日或每月的列表造出来。

怎么造?要用到系统的MASTER..spt_values表,这个表有很多妙用,目前我只熟悉他的number字段。

select number from master..spt_values where type = 'p'

获取的是从0到2047,共2048个数字。

然后我们利用日期的DATEDIFF函数、DATEADD函数,以及CONVERT函数就能形成我们想要的列。举例:

获取2020年1月1号到今天的每月的数据列:

select CONVERT(varchar(7),DATEADD(MONTH,number,'2020-1-1'), 23) as MonthNo
from master..spt_values
where type='p' AND number <= DATEDIFF(MONTH,'2020-1-1',getdate())

获取2020年1月1号到今天的每日的数据列:

select CONVERT(varchar(100),DATEADD(day,number,'2020-1-1'), 23) as MonthNo
from master..spt_values
where type='p' AND number <= DATEDIFF(day,'2020-1-1',getdate())

SQL Server 事务日志已满,3种解决方案

我们安装数据库后,系统会默认把数据库文件和数据库日志文件最大设为500MB,当然你中途可以更改这个限制。当日志文件接近最大值时,继续使用数据库会提示:事务日志已满。解决这个问题,有3种方案:

第一种解决方案:在数据库上点击右键 → 选择 属性 → 选择 文件,然后增加数据库日志文件的文件大小。
增大日志文件的大小.png


阅读剩余部分

SQL Server清除数据中的回车符、换行符、制表符

在SQL Server中,回车符的AASCII码是13,换行符的ASCII码是10,制表符t的ASCII码CHAR(9)
1,回车符
查找有回车符的内容

select id,theme from TableName where charindex(char(13),theme) > 0

清除回车符

update TableName set theme=replace(theme, char(13),'') where 1=1

2,换行符
查找有换行符的内容

select id,theme from TableName where charindex(char(10),theme) > 0

清除换行符

update TableName set theme=replace(theme, char(10),'') where 1=1

3,制表符t
查找有制表符的内容

select id,theme from TableName where charindex(char(9),theme) > 0

清除制表符

update TableName set theme=replace(theme, char(9),'') where 1=1

4,回车换行符
查找有回车换行符的内容

select id,theme from TableName where charindex(char(13) + char(10),theme) > 0

清除回车换行符

update TableName set theme=replace(theme,char(13) + char(10),'') where 1=1

Sql Server 存储过程传入数组参数的处理方案

在使用存储过程时,不可避免会遇到:把一个以逗号分隔的数字字符串当成数组一样传给存储过程,如下:

exec proc_FuckMe '6,7,8';

存储过程SQL中想当然地用where id in (@ID)这种方式去接传过来的值,会报错的!
解决方案如下代码,在存储过程里面添加一个逻辑,把传进来的值处理一下,然后再给SQL使用:

declare @StrArray varchar(100),@split varchar(100)  --定义@split分隔符,@StrArray需要转换的类似数字数组的字符串 比如6,7,8
set @StrArray=@ID  --从存储过程的形参中获取数据
set @split= ',' --设置分隔符
declare @TempTable table(Row int identity(1,1) not null,TempID int)  --在内存中定义一个临时表,临时字段TempID
set @StrArray=@StrArray+@split  --最后要加个分隔符,
while(charindex(@split,@StrArray)<>0)  
begin 
   insert @TempTable(TempID) values (substring(@StrArray,1,charindex(@split,@StrArray)-1)) 
   set @StrArray = stuff(@StrArray,1,charindex(@split,@StrArray),'') 
end

上面处理完后,后面的SQL使用:

select * from Table where id in (select TempID from @TempTable)

select TempID from @TempTable 通过这个SQL获取到转换后的ID数组结果

最后再强调下:存储过程接收'6,7,8'这种像是数组,实际上是以逗号分隔的数字字符串时,对应的参数要命名为varchar(500),不能再命名为int类型。