第一次写动态SQL的得到的经验

xiaoxiao2025-12-06  2

前言 [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)
转载请注明原文地址: https://www.6miu.com/read-5040412.html

最新回复(0)