我正在尝试在动态sql查询中处理null变量
查询如下
DECLARE @_param_one VARCHAR(256)=NULL
DECLARE @_param_two VARCHAR(256)=''
DECLARE @SQLStr VARCHAR(MAX)
如果未将其转换为字符串,则下面的select语句将按预期工作
SELECT (SELECT CASE WHEN(COALESCE(@_param_one, '' ) = '') THEN 'WORKING' ELSE @_param_one END) AS [Param_One]
转换为字符串并执行后,该字符串无法按预期工作。执行的字符串显示为空。
SET @SQLStr='SELECT DISTINCT
Column_One,
Column_Two,
Column_Three
(SELECT CASE WHEN(COALESCE( '''+@_param_one+''', '''' ) = '''')
THEN Param_One ELSE '''+@_param_one+''' END) AS
[Param_One]
FROM Table_One AS [![enter image description here][1]][1]Tbl WHERE Tbl.Id=2'
select @SQLStr
答案 0 :(得分:1)
为此,我将使用sp_executesql代替Dynamic SQL的基本EXEC。首先是一些简化的示例数据:
IF OBJECT_ID('tempdb..#table_one','U') IS NOT NULL DROP TABLE #table_one;
SELECT ID
INTO #table_one
FROM (VALUES (1),(2),(2),(3),(5)) AS x(ID);
sp_executesql解决方案如下所示:
DECLARE @Param_One VARCHAR(512), @sql NVARCHAR(4000);
SET @sql =
N'SELECT DISTINCT CASE WHEN COALESCE(@Param_one,'''') = ''''
THEN ''<blank>'' ELSE @Param_one END
FROM #table_one AS t
WHERE t.id = 2;'
EXEC sp_executesql @sql, N'@Param_One VARCHAR(256)', @Param_One = @Param_One;
请注意,当您的@param_one为空null时,我将返回文本“空白”-我不理解您的case语句。但是,此代码应该可以帮助您。随时回答后续问题。
答案 1 :(得分:0)
在上述语句中有很多错误(例如SQL注入),在SQL中null是一种特殊情况。从SQL的意义上说,将NULL表示为单词并不表示NULL。您可以添加一些代码来检测NULL是否为预期参数,并相应地更改SQL语句。
简而言之,仅将参数替换为字符串并不总是可行。