2016-07-31 3 views
0

Ich habe eine gespeicherte Prozedur, die mit einer Insert-Anweisung für eine Tabelle in SQL Server 2012Optionale Spalten in SQL Server Insert-Anweisung basierend auf Eingangswert

Es alle Spalten aufgelistet und die Werte als solche:

insert into TABLE_NAME (name, rating, link) 
values (@name, @rating, @link). 

Das Problem, das ich habe, ist, dass einige der Spalten als null angegeben sind, aber die Werte an die gespeicherte Prozedur als leere Zeichenfolgen (oder null für int Spalte Typen, die Nullen zulassen) übergeben und ich möchte keine leere Zeichenfolge einfügen oder eine Null in einer Spalte, die Nullen erlaubt.

Gibt es eine Möglichkeit, die INSERT-Anweisung zu ändern, um diejenigen Spalten auszuschließen, deren Werte nicht eingefügt werden sollen, nur basierend auf den Werten der übergebenen Parameter?

Antwort

1

Sie können die Werte aus der INSERT-Anweisung nicht dynamisch ausschließen, aber Sie können the NULLIF function verwenden, um Ihre Eingabewerte in NULL zu konvertieren, wenn sie eine leere Zeichenfolge sind oder was auch immer Sie nicht möchten.

+0

Perfekt, das ist, was ich brauchte. Ich war mir dessen nicht bewusst. –

1
INSERT INTO TABLE_NAME (name, rating, link) 
SELECT NULLIF(@name, ''), NULLIF(@rating, 0), NULLIF(@link, '') 
0

Ich glaube nicht, dass SQL Server einen Ausdruck mit "DEFAULT" erlaubt, wo man sagen könnte:

insert into TABLE_NAME (name, rating, link) 
    values (coalesce(@name, default), coalesce(@rating, default), coalesce(@link, default)) 

So, das dynamische SQL verlässt. Etwas wie dieses:

declare @sql nvarchar(max); 

set @sql = 'insert into TABLE_NAME(name, rating, link) 
       values (' + (case when @name is null then 'default' else '@name' end) + ', ' + 
         (case when @rating is null then 'default' else '@rating' end) + ', ' + 
         (case when @link is null then 'default' else '@link' end))'; 

exec sp_executesql @sql, N'@name ??, @rating ??, @link ??', 
     @name = @name, @rating = @rating, @link = @link; 
Verwandte Themen