【发布时间】:2015-06-24 10:13:04
【问题描述】:
SET @SQL =
'SELECT
CaseStatus =
CASE Level1Status
WHEN 1100 THEN ''Case Submitted to QC''
WHEN 1200 THEN ''Pending QC''
WHEN 1400 THEN ''Passed QC''
END,
我目前在使用上面的动态 sql/case 表达式时遇到问题,因为我似乎无法将字符串放入动态 sql 中,有没有人碰巧有解决这个问题的方法
编辑
作为 开始 声明@SQL nvarchar(4000)
SET @SQL =
'SELECT
CaseStatus =
CASE Level1Status
WHEN 1100 THEN ''Case Submitted to QC''
WHEN 1200 THEN ''Pending QC''
WHEN 1400 THEN ''Passed QC''
END,
CaseStartDateTime,
CaseEndDateTime,
StatusName,
Cell_NameDescription,
QCAnalystName,
AnalystName,
Upload_Datetime,
Requesting_Entity,
Legal_Entity_TypeDescription,
HighPriorityDescription,
DD_Level_RequiredDescription,
CountryDscr,
Maintable.KYCCaseId AS KYCCaseId
FROM
UACTc75760ab10784b51b585f082d4b25223 AS MI,
UACT175e55161660402692a53a4cdeb89bd6 AS MainTable,
UACT5996d6e5151245cab24e4e76e3e53540 AS Statuses,
UACTde5f05df6c5f4872a1e57b3cf8368301 AS AddressDetails
WHERE
(
MI.CaseStartDateTime BETWEEN ' + quotename(convert(varchar(10), @CaseStartDateTime, 120), '''') + ' AND ' + quotename(convert(varchar(10), @CaseEndDateTime, 120), '''') +
' OR
MI.CaseEndDateTime BETWEEN ' + quotename(convert(varchar(10), @CaseStartDateTime, 120), '''') + ' AND ' + quotename(convert(varchar(10), @CaseEndDateTime, 120), '''') +
' )
AND
MI.KYCCase_Id = MainTable.KYCCaseId'
IF @StatusName IS NOT NULL AND ltrim(rtrim(@StatusName)) != N''
SET @SQL = @SQL + '
AND
Statuses.SourceStatus = MainTable.Level1Status
AND
Statuses.StatusName = ' + quotename(@StatusName, '''')
IF @CountryDscr IS NOT NULL AND ltrim(rtrim(@CountryDscr)) != N''
SET @SQL = @SQL + '
AND
AddressDetails.CountryDscr = ' + quotename(@CountryDscr, '''')
IF @CellDscr IS NOT NULL AND ltrim(rtrim(@CellDscr)) != N''
SET @SQL = @SQL + '
AND
MainTable.Cell_NameDescription = ' + quotename(@CellDscr, '''')
IF @QCAnalystName IS NOT NULL AND ltrim(rtrim(@QCAnalystName)) != N''
SET @SQL = @SQL + '
AND
MainTable.QCAnalystName = ' + quotename(@QCAnalystName, '''')
IF @AnalystName IS NOT NULL AND ltrim(rtrim(@AnalystName)) != N''
SET @SQL = @SQL + '
AND
MainTable.AnalystName = ' + quotename(@AnalystName, '''')
IF @RequestingEntity IS NOT NULL AND ltrim(rtrim(@RequestingEntity)) != N''
SET @SQL = @SQL + '
AND
MainTable.Requesting_Entity = ' + quotename(@RequestingEntity, '''')
IF @EntityType IS NOT NULL AND ltrim(rtrim(@EntityType)) != N''
SET @SQL = @SQL + '
AND
MainTable.Legal_Entity_TypeDescription = ' + quotename(@EntityType, '''')
IF @HighPriority IS NOT NULL AND ltrim(rtrim(@HighPriority)) != N''
SET @SQL = @SQL + '
AND
MainTable.HighPriorityDescription = ' + quotename(@HighPriority, '''')
IF @DDLevelRequired IS NOT NULL AND ltrim(rtrim(@DDLevelRequired)) != N''
SET @SQL = @SQL + '
AND
MainTable.DD_Level_RequiredDescription = ' + quotename(@DDLevelRequired, '''')
EXEC sp_executesql @SQL
这是整个代码,我得到的错误是
消息 156,第 15 级,状态 1,第 32 行
关键字“Case”附近的语法不正确。
【问题讨论】:
-
请澄清查询,以便我们了解您要执行的操作。
-
我正在尝试为报告创建过滤器,如果状态为 1100、1200 和 1400,则会在表格中添加一列以反映字符串“已提交案例”、“待定 QC”和“ Passed QC',问题是因为我的动态 sql 当前设置为变量 @SQL 作为字符串,我无法将字符串 'Case Submitted'、'Pending QC' 和 'Passed QC' 添加到 case 语句谢谢
-
@EmperorDev 使用动态 sql 和您的代码也可以正常工作。
-
我认为这不是你的问题。你到底得到了什么错误?您能否向我们展示您的其余代码,因为这当然不是全部。
-
@EmperorDev,只需使用
PRINT @SQL而不是EXEC sp_executesql @SQL。您将看到实际构造的查询。尝试手动执行它/如果出现错误,您可能会看到与错误连接的位置。更正并重试...您引用了所有内容...日期、字符串、数字。当您引用结果时,引擎将作为某些列名称或其他对象名称获取结果。玩弄打印。
标签: sql sql-server sql-server-2008 sql-server-2008-r2 dynamic-sql