1.什么时候用+号?
---- 为了组成一个字符串类型的语句,要用+号作连接符。 一般情况下,字符串与字符串变量连接时才用加号。
如:DECLARE @SQL NVARCHAR(1000),@tablename nvarchar(100),@SORTFIELD NVARCHAR(100) SELECT @TABLENAME=N'MYTABLE',@SORTFIELD=N'USERCODE' SET @SQL=N'SELECT * from '+@tablename+N' order by '+@FIELDSORT ' 这样的组成的SQL语句是: SELECT * from MYTABLE order by USERCODE 2.什么时候用引号:
----常数字符串都要用引号,如上面例子的N'SELECT * FROM ' 3.什么时候用空格: ----一般连接关键字的引号内侧要加一空格,如:N'SELECT * from '+@tablename
FROM 后面要加空格,否则连接后会成为:SELECT * FROMMYTABLE,FROM 和MYTABLE连起来了,从而出错。
4.其它要注意的:---生成后字串中有引号的语句。
比如要生成这样一个语句:SELECT * FROM MYTABLE WHERE USERCODE='' 这样写是不对的:SET @SQL=N'SELECT * from '+@tablename+' WHERE USERCODE='' ' 这样才是对的:SET @SQL=N'SELECT * from '+@tablename+' WHERE USERCODE=N'''' ' 可以看出:在字串中间的两个引号变成了4个。总结一下:语句中间需要显示出的引号,引号个数要加倍!
----------示例如下:
CREATE PROCEDURE [dbo].[PROC_M_B3_LQ] @F_GSID CHAR(10), @F_ZZRQ INT , @TABLENAME VARCHAR(40), --计算数据表名 @FIELDNAME VARCHAR(20), --字段数据 @TYPE INT, --类型:0-季度;1-年度(过去12个月) @VALUES MONEY OUTPUT --输出计算结果 AS BEGIN SET NOCOUNT ON; DECLARE @SQL VARCHAR(2000) ------动态SQL生成缓存数据 IF EXISTS(SELECT * FROM tedb.dbo.sysobjects WHERE [name]='##B3' and type='U') drop table ##B3 CREATE TABLE ##B3 (F_GSID CHAR(10),F_ZZRQ INT,F_VALUES MONEY, CONSTRAINT [PK_##B3_1] PRIMARY KEY CLUSTERED ( F_GSID ASC, F_ZZRQ ASC )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] SET @SQL='INSERT INTO ##B1T03(F_GSID,F_ZZRQ,F_VALUES) SELECT F_GSID,dbo.fn_datetoint(F_ZZRQ),(SELECT TOP(1) '+@FIELDNAME+' FROM '+@TABLENAME+' WHERE F_GSID=M.F_GSID AND dbo.fn_datetoint(F_ZZRQ)=dbo.fn_datetoint(M.F_ZZRQ) AND F_BBFL=''C'' ) FROM '+@TABLENAME+' AS M WHERE F_GSID='''+@F_GSID+''' AND F_BBFL=''C''' EXEC (@SQL) . . .