[置顶] 存储过程调用表名为变量...(含基本sql语法说明)

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) . . . 

 

你可能感兴趣的:(sql,c,table,存储,insert)