用NULL本身连接字符串

时间:2014-04-03 06:27:04

标签: sql sql-server sql-server-2008

如何让这部分查询返回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) 

3 个答案:

答案 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周围的单引号。我不确定你为什么会收到转换错误。