Sql state statement when nonzero

I want to dynamically generate variable declarations based on a table. I want to say that I want to declare table variables, each variable must be of the same type as its column. I do something similar, but the result only works if the type is not 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'

And my result is

(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
+5
source share
2 answers

CASE x WHEN null THENmatches with CASE WHEN x = null THEN. But nothing is zero. This means that you always get the ELSE part of your CASE statement. This means that you are trying to combine a string with NULL, which always gives NULL.

Instead, you need 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'
+14
source

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'
+1

All Articles