如何让这部分查询返回NULL?
DECLARE @SQL NVARCHAR(MAX),
@Date DATETIME = NULL
SET @SQL = 'SELECT ' + CASE WHEN @Date IS NULL THEN NULL ELSE CONVERT(NVARCHAR(MAX), @Date) END
EXEC(@SQL)
PS:NULL和''在这个例子中是不一样的。如果我尝试将此查询的结果插入到数据库中,我将获得:
从字符转换日期和/或时间时转换失败 字符串。
是否有类似于c#" DBNull.Value" SQL中的值?
PS2:我认为ELSE NULL并不是多余的。如果没有传递日期参数,我需要传递NULL值来插入脚本。就像:
INSERT INTO [AccDocuments].[DOCUMENT].[Documents]
([Some_Date])
VALUES (CASE WHEN @Date IS NULL THEN NULL ELSE CONVERT(NVARCHAR(MAX), @Date) END)
答案 0 :(得分:0)
试试这个:
@Date DATETIME = NULL
SELECT CASE WHEN @Date IS NOT NULL THEN CONVERT(NVARCHAR(MAX), @Date) ELSE @Date END as date
如果CONVERT(NVARCHAR(MAX), @Date)
不为null,它将返回@Date
,否则返回@Date
本身(为空)。
查看SQL Fiddle中的结果。
答案 1 :(得分:0)
你需要在转义的qoutes
中包含你的非空值DECLARE @SQL NVARCHAR(MAX),
@Date datetime=getdate()
SET @SQL = 'SELECT ' +CASE WHEN @Date IS NULL THEN NULL
ELSE ''''+ cast(@Date as nvarchar(max))+'''' END
print @sql
EXEC(@SQL)
答案 2 :(得分:0)
CONCAT_NULL_YIELDS_NULL
将在这里发挥作用。如果@Date为NULL
,您的查询将导致NULL字符串,因为您将NULL
连接成一个字符串,我感觉默认情况下CONCAT_NULL_YIELDS_NULL
处于启用状态。
但是我想你最终想要一个像'SELECT NULL'
这样的字符串,对吗?在这种情况下,您的陈述需要阅读:
DECLARE @SQL NVARCHAR(MAX),
@Date DATETIME = NULL
SET @SQL = 'SELECT ' + CASE WHEN @Date IS NULL THEN 'NULL' ELSE CONVERT(NVARCHAR(MAX), @Date) END
EXEC(@SQL)
请注意NULL
语句的真实部分中CASE
周围的单引号。我不确定你为什么会收到转换错误。