Sql Case语句何时不为null

时间:2012-02-01 17:17:38

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

我想根据表动态生成变量声明。 我的意思是,我想声明一个表的变量,每个变量必须与其列的类型相同 我正在做类似的事情,但结果只有在类型不是int

时才有效
Select 'Declare @Doc' + COLUMN_NAME + ' '+DATA_TYPE+case(CHARACTER_MAXIMUM_LENGTH) when Null then ' '  else '(' +convert(varchar(12),CHARACTER_MAXIMUM_LENGTH) + ')' end 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME = 'Documentos'

我的结果就是这个

(No column name)
NULL
Declare @DocSerie varchar(5)
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
Declare @DocImporteLetras varchar(255)
Declare @DocMotivos text(2147483647)
NULL
Declare @DocDocumentosReferencia varchar(255)
NULL
NULL
Declare @DocAuditoriaIPC varchar(40)
NULL
NULL
Declare @DocAuditoriaIPM varchar(40)
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL

2 个答案:

答案 0 :(得分:14)

CASE x WHEN null THENCASE WHEN x = null THEN相同。但是没有任何东西以这种方式等于null。这意味着您总是获得CASE语句的ELSE部分。这意味着您正在尝试将字符串与NULL连接,这总是会产生NULL。

您需要CASE WHEN x IS NULL THEN而不是......

SELECT
  'Declare @Doc'
  + COLUMN_NAME + ' '
  + DATA_TYPE
  + CASE WHEN (CHARACTER_MAXIMUM_LENGTH) IS Null then ' '  else '(' convert(varchar(12),CHARACTER_MAXIMUM_LENGTH) + ')' end 
FROM
  INFORMATION_SCHEMA.COLUMNS 
WHERE
  TABLE_NAME = 'Documentos'

答案 1 :(得分:2)

Coalesce

SELECT 'Declare @Doc'
  + COLUMN_NAME + ' '
  + DATA_TYPE + Coalesce('(' + CHARACTER_MAXIMUM_LENGTH + ')', '')
FROM
  INFORMATION_SCHEMA.COLUMNS 
WHERE
  TABLE_NAME = 'Documentos'

<强> Switch Case

SELECT 'Declare @Doc' 
  + COLUMN_NAME + ' ' 
  + DATA_TYPE 
  + Case When CHARACTER_MAXIMUM_LENGTH Is Null Then '' Else '(' + Convert(Varchar, CHARACTER_MAXIMUM_LENGTH) + ')' End
FROM
  INFORMATION_SCHEMA.COLUMNS 
WHERE
  TABLE_NAME = 'Documentos'