前言
[quote]
用动态SQL写存储过程的原因,项目中有个存储过程必须把字段名作为变量,而
字段名,表名,数据库名之类作为变量时,必须用动态SQL ,所以就开始学习写动态SQL
[/quote]
[color=red]写动态SQL 注意事项[/color]
[quote]
动态串中:
(1)用两个单引号表示一个。
(2)日期需要用单引号。
(3)日期型需要先转换为字符型,用cast()或convert()。eg:Convert(Varchar(10),@BeginDate,120)
(4)数字型需要先转换为字符型。 用Rtrim(数字型变量)(注意,这里虽然转成了字符串,但在动态SQL串中不不用单引号引起来)
[/quote]
这个是@SQL前为什么要加N的解释(现在还不太明白什么意思)
[quote]
包含 Transact-SQL 语句或批处理的 Unicode 字符串,stmt 必须是可以隐式转换为 ntext 的 Unicode 常量或变量。不允许使用更复杂的 Unicode 表达式(例如使用 + 运算符串联两个字符串)。不允许使用字符常量。如果指定常量,则必须使用 N 作为前缀。例如,Unicode 常量 N'sp_who' 是有效的,但是字符常量 'sp_who' 则无效。字符串的大小仅受可用数据库服务器内存限制。
stmt 可以包含与变量名形式相同的参数,例如:
N'SELECT * FROM Employees WHERE EmployeeID = @IDParameter'
[/quote]
示例代码:
DECLARE @SearchType varchar(20) IF @SearchTypeID = 1 SET @SearchType = 'Name' --根据主题查询 ELSE IF @SearchTypeID = 2 SET @SearchType = 'FromAddress'--根据发件人查询 ELSE IF @SearchTypeID = 3 SET @SearchType = 'TOAddress' --根据收件人查询DECLARE @SqlWhere varchar(1000) SET @SqlWhere= 'WHERE UserName ='''+@UserName+''''IF @FolderID <>0 --如果不是搜索所有的邮件,就按文件夹的ID搜索 SET @SqlWhere = @SqlWhere+' AND FolderID = '+Rtrim(@FolderID)IF @BeginDateStr <>'' --按日期搜索 SET @SqlWhere = @SqlWhere+' AND (CreateDate between '''+@BeginDateStr+''' AND '''+ @EndDateStr+''') 'IF @Key <>'' --按关键字搜索 SET @SqlWhere = @SqlWhere+' AND '+@SearchType +' LIKE ''%'+@Key+'%'''DECLARE @SQL VARCHAR(400) SET @SQL = N'SELECT * FROM AjaxMail '+@SqlWhere ---- 执行语句 ---- EXEC(@SQL)