字符串中为 NULL 的 MSSQL CONCAT

MSSQL CONCAT with NULL in string

提问人:stranges 提问时间:5/16/2023 更新时间:5/16/2023 访问量:38

问:

我不需要将参数发送到函数中,并且我动态生成代码。 如果变量类型为 INTEGER 且值为 NULL,则我有“”,但我需要“null”。 请帮我找到正常的决定:

DECLARE @a INT = NULL, @b INT = 5;

SELECT CONCAT('SELECT dbo.fncName(',@a,',',@b,')') AS Result;
--result  "SELECT dbo.fncName(,5)",
--I need: "SELECT dbo.fncName(NULL,5)"
GO

-- it works, but it looks very bad:
DECLARE @a INT = NULL, @b INT = 5;

DECLARE @a1 VARCHAR(16) = IIF(CAST(@a AS VARCHAR(16)) IS NULL,'NULL',CAST(@a AS VARCHAR(16)));
SELECT CONCAT('SELECT dbo.fncName(',@a1,',',@b,')') AS Result;
--result "SELECT dbo.fncName(NULL,5)"

sql-server null 串联

评论

2赞 siggemannen 5/16/2023
你为什么要这么做?如果您确实需要动态但仍然正常传递参数,则可以使用 sp_executesql
0赞 stranges 5/16/2023
完全!我忘记了sp_executesql....谢谢!

答:

1赞 Charlieface 5/16/2023 #1

为此,您需要动态 SQL。您可以使用sp_executesql

DECLARE @a INT = NULL, @b INT = 5;

DECLARE @sql nvarchar(max) = CONCAT(
  'SELECT dbo.',
  QUOTENAME(@procName),
  '(@a, @b) AS Result;'
);
EXEC sp_executesql @sql,
  N'@a int, @b int',
  @a = @a,
  @b = @b;

甚至更好的是:标量函数实际上可以像过程一样直接调用。

DECLARE @a INT = NULL, @b INT = 5, @result INT;

EXEC @result = @procName
  @a = @a,
  @b = @b;

SELECT @result AS Result;