动态SQL语法

来源:互联网 发布:cad图纸加密软件 编辑:程序博客网 时间:2024/05/22 15:02

 --动态语句方法:

--方法1查询表改为动态
select * from sysobjects
exec('select ID,Name from sysobjects')
exec sp_executesql N'select ID,Name from sysobjects'--多了一个N为unicode

--方法2:字段名,表名,数据库名之类作为变量时,用动态SQL
declare @FName varchar(20)
set @FName='ID'
exec('select '+@FName+' from sysobjects where '+@FName+'=5' )


declare @s varchar(1000)
set @s=N'select '+@FName+' from sysobjects where '+@FName+'=5'
exec sp_executesql @s--会报错


declare @s nvarchar(1000)--改为nvarchar
set @s=N'select '+@FName+' from sysobjects where '+@FName+'=5'
exec sp_executesql @s--成功


--方法3:输入参数

declare @i int,@s nvarchar(1000)
set @i=5
exec('select ID,Name from sysobjects where ID='+@i)

set @s='select ID,Name from sysobjects where ID=@i'
exec sp_executesql @s,N'@i int',@i--此处输入参数要加上N

--方法4:输出参数

declare @i int,@s nvarchar(1000)
set @s='select @i=count(1) from sysobjects'

--用exec
exec('declare @i int '+@s+' select @i')--把整个语句用字符串加起来执行

--用sp_executesql
exec sp_executesql @s,N'@i int output',@i output--此处输出参数要加上N
select @i


--方法5:输入输出

--用sp_executesql
declare @i int,@con int,@s nvarchar(1000)
set @i=5
select @s='select @con=count(1) from sysobjects where ID>@i'
exec sp_executesql @s,N'@con int output,@i int',@con output ,@i
select @con

--用exec
declare @i int,@s nvarchar(1000)
set @i=5
select @s='declare @con int select @con=count(1) from sysobjects where ID>'+rtrim(@i)+' select @con'
exec(@s)

 

----语法

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个。

总结一下:
语句中间需要显示出的引号,引号个数要加倍。