如何在动态sql查询中处理null

时间:2019-04-08 19:00:02

标签: mysql asp.net tsql asp.net-web-api

我正在尝试在动态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

enter image description here

2 个答案:

答案 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语句。

简而言之,仅将参数替换为字符串并不总是可行。