Tsql 空字符串的NULLIF检查返回具有列名的空字符串,但具有列值的NULL

Tsql 空字符串的NULLIF检查返回具有列名的空字符串,但具有列值的NULL,tsql,sql-server-2005,Tsql,Sql Server 2005,我有一个数据库列设置为char255是的,CHAR。不要问我为什么数据库是这样设置的,目前它有一个空字符串和两个空格,即。使用NULLIFLTRIMRTRIMcolumn_name不起作用。输出为[两个空格]。但是,使用NULLIF“”可以正常工作,并且输出为NULL。换句话说,实际列值工作正常,而传递列的名称返回的值不正确 对此有什么想法吗?我相信这个专栏肯定不止有空格。例如: CREATE TABLE #x(id INT, y CHAR(255)); INSERT #X SELECT 1,

我有一个数据库列设置为char255是的,CHAR。不要问我为什么数据库是这样设置的,目前它有一个空字符串和两个空格,即。使用NULLIFLTRIMRTRIMcolumn_name不起作用。输出为[两个空格]。但是,使用NULLIF“”可以正常工作,并且输出为NULL。换句话说,实际列值工作正常,而传递列的名称返回的值不正确


对此有什么想法吗?

我相信这个专栏肯定不止有空格。例如:

CREATE TABLE #x(id INT, y CHAR(255));

INSERT #X SELECT 1, ' '
UNION ALL SELECT 2, '  '
UNION ALL SELECT 3, ' ' + CHAR(9);

SELECT id, NULLIF(LTRIM(RTRIM(y)),'') FROM #x;
结果:

1   NULL
2   NULL
3   
对于失败的行,请尝试以下操作:

DECLARE @s CHAR(255);
SELECT @s = y FROM #x WHERE id = 3;

DECLARE @i INT;
SET @i = 1;
WHILE @i <= DATALENGTH(@s)
BEGIN
  IF ASCII(SUBSTRING(@s, @i, 1)) <> 32
  BEGIN
    PRINT 'Position ' + RTRIM(@i) + ' = CHAR(' 
          + RTRIM(ASCII(SUBSTRING(@s, @i, 1))) + ')';
  END
  SET @i = @i + 1;
END

它应该告诉您还有哪些字符在其中,以及在哪里。

对我来说很好:原因是您没有将可打印字符打印到列中。看到了吗?你确定它们是char而不是nchar吗?@DourHighArch你能解释一下为什么这很重要吗?无论是CHAR还是NCHAR,LTRIM和RTRIM都将以相同的方式删除空格。@Aaron,NCHAR中的空格种类比CHAR non breaking、en、em、figure、thin等中的要多。我想Trim等可能会对它们进行不同的处理。我只是尝试了一下,看起来非CHAR空格被转换为“?”,所以不是这样。