2012-02-01 15 views
5

Chcę generować deklarację zmiennych dynamicznie w zależności od tabeli. To znaczy, chcę zadeklarować zmienne tabeli, każda zmienna musi być tego samego typu, jak jego kolumnie robię coś takiego, ale wynik działa tylko wtedy, gdy nie jest to typ intSql Case Statement, gdy nie jest null

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' 

a mój wynik jest ten

(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 

Odpowiedz

14

CASE x WHEN null THEN jest taka sama jak CASE WHEN x = null THEN. Ale w ten sposób nic nie jest równe zeru. Oznacza to, że zawsze uzyskujesz ELSE część swojego zdania CASE. A to oznacza, że ​​próbujesz połączyć łańcuch z wartością NULL, która zawsze daje NULL.

Trzeba CASE WHEN x IS NULL THEN zamiast ...

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

Działa to idealny! Dzięki – jcvegan

1

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'