方法一:set 变量=(select 字段 from 表 where ) 注:select语句必须加().
方法二:select 变量1=字段1,变量2=字段2,... from 表 where .
2、变量赋值
错误:set @Dsp1='1',@Dsp2='2'
正确:select @Dsp3='3',@Dsp4='4'
3、数据类型转换
时间类型转字符:convert(varchar(8),getdate(),108) --12:12:34
convert(varchar(10),dBrushDT,112) --20120819
convert(varchar(19),GETDATE(),120) --2012-09-21 19:44:11
数字类型转字符:cast(数字 as varchar(10))
字符转数字:cast('3.34' as decimal(9,1))
4、NUll值判断
变量判断:IF @变量 is null or @变量=0
SQL语句:WHERE COLUMN_NAME IS NULL
ISNULL函数:ISNULL(变量/字段,'为空的时默认值')
5、两个字符串时间之间的差
DATEDIFF(ss, convert(datetime,'2012-09-21 01:26:50',120), convert(datetime,'2012-09-21 01:27:54',120))
以10分钟为单位时间取整
DATEADD(mi,DATEDIFF(mi,convert(datetime,convert(varchar(10),getdate(),120),120),getdate())/10*10,convert(datetime,convert(varchar(10),getdate(),120),120))
时间转换
SELECT
CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time'
,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date'
,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS
'smalldatetime'
,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime'
,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS
'datetime2'
,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS
'datetimeoffset';
WITH ENCRYPTION
在AS前面可以加
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
使用 ENCRYPTION 选项创建的存储过程不能使用 sp_helptext 查看。
7、分解用逗号分的字符串
declare @_str varchar(100),
set @_str=',,,abc,de fg, , ,,hijklmn'+',,,,'
set @_i=CHARINDEX(',',@_str)
while @_i=1 --删除前面重复的','
begin
set @_str=right(@_str,len(@_str) -1)
set @_i=CHARINDEX(',',@_str)
end
while @_i>0
begin
set @_a=left(@_str,@_i -1)
--编写程序
if @_a<>''
select @_a
set @_str=right(@_str,len(@_str)-@_i)
set @_i=charindex(',',@_str)
while @_i=1 --删除后面重复的','
begin
set @_str=right(@_str,len(@_str) -1)
set @_i=CHARINDEX(',',@_str)
end
end
select ('N0002' + right(convert(varchar(10),year(getdate())),2)
+ convert(varchar,month(getdate()))
+right(convert(varchar,getdate(),111),2))+right('0000'+convert(varchar(4),(substring(isnull(max(ordno),0),12,4)+ 1)),4) as ordno1
from mps_mfg_ord
where ordno like ('N0002' + right(convert(varchar(10),year(getdate())),2)
+ convert(varchar,month(getdate()))
+right(convert(varchar,getdate(),111),2)) +'____'
简化版:
SET @_cCheckID=(SELECT 'CH'+CONVERT(CHAR(4),GETDATE(),12)+RIGHT(('0000'+CONVERT(VARCHAR(4),RIGHT(ISNULL(MAX(cCheckid),0),4)+1)),4)
WHERE cCheckid LIKE ('CH'+CONVERT(CHAR(4),GETDATE(),12)+'____')
9、发现了一个SQL重要功能,通过(触发器:INSTEAD OF)来改变插入的值;
也可以用这个功能来实现一次性输入插入多个表或更新多个表的功能。
10、计算字符串公式,返回数值
--//***********************************************************************
--//函数:Gu_GetComputeExp
--//功能:计算字符串公式,比如将 2*5+5字符串返回结果为15
--//入口参数:/*传递该函数的参数列表及相对应的说明*/
--//出口参数
--// @_cExpression,varchar(8000)字符串
--//调用事例:/*函数在程序段中调用的实例说明*/
时间:2008/12/27;修改:*** 时间:
--/***********************************************************************
CREATE PROCEDURE [Gu_GetComputeExp]
@_cExpression varchar(8000),
@_nVaule dec(18,6) out
WITH ENCRYPTION
AS
DECLARE @_DySQLl nvarchar(4000)
BEGIN
SET @_DySQLl = N'set @_nVaule = ' + @_cExpression
EXEC SP_EXECUTESQL @_DySQLl ,N'@_nVaule decimal(18,6) out', @_nVaule out
END
11、数据库恢复
restore database NGBaBei from disk='D:\3.NGGS项目\2.项目开发\Gerp_BaBei\database\090107nbbabei' with replace
restore database NG0001 from disk='D:\3.NGGS项目\8.安装文件\ng00010116\ng00010116' with replace
12、提高SQL性能:
WITH RECOMPILE 每次执行都进行编译
SET NOCOUNT ON 这个声明可以有助于减少服务器和客户端之间的通信