2017-10-20 1 views
0

Am derzeit keine Aufzeichnung einzufügen, wenn alle Spaltennamen inSQL Server gespeicherte Prozedur einfügen mit dynamischen exec

Beilage

unten ist die SP

ALTER PROCEDURE [dbo].[test] 
@tab_name nvarchar(50), 
@tab_id int, 
@tab_n nvarchar(50), 
@tab_q int 
as 
Begin 
declare @sql as nvarchar(50); 
declare @counts as int; 

select @sql='select @cnt=count(*) from '[email protected]_name+' where id='+cast(@tab_id as varchar)+';' 
exec sp_executesql @sql,N'@cnt int output', @[email protected] output 

wählen @counts als zählt

if @counts=1 
begin 
declare @sql1 as nvarchar(50); 
select @sql1='update '[email protected]_name+' set quantity='+cast(@tab_q as varchar)+'  where id='+cast(@tab_id as varchar)+';' 
exec sp_executesql @sql1 
end 
else 
begin 
declare @sql2 as nvarchar(50); 
set @sql2='insert into '[email protected]_name+' (id,name,quantity) values ('+CAST(@tab_id as varchar)+','''[email protected]_n+'''' 
set @sql2+=','+CAST(@tab_q as varchar)+');' 
select @sql2 
exec sp_executesql @sql2 
end 
End 

"

command: exec dbo.test @tab_name='inventory',@tab_id=4,@tab_n='chiku',@tab_q=123 

Datensatz wird eingefügt, wenn Spaltennamen entfernt werden, funktioniert aber nicht mit Spaltennamen während des Einfügens.

Bitte helfen.

Dank

+0

declare @ sql1 als nvarchar (50) dat ist lang genug für die dynamische Abfrage? –

+0

Danke frederik-de-clercq Ich habe es Max gemacht und es funktioniert .. Der Fehler wurde in Zeile 1 der Exec Befehl angezeigt .. wurde wirklich frustriert. Danke vielmals – Santhosh

Antwort

1

Es ist besser, einen nvarchar (max) für dynamische Abfragen mit Parametern zu verwenden. Weil du nie weißt, wie lang die Saite sein kann. es sei denn, Sie kennen die maximale Länge der Zeichenfolge.

Ein dba sagte mir auch, N 'als Präfix vor der Zeichenfolge zu verwenden, um Unicode-String-Literale zu bezeichnen.

0

Zunahme @sql Variablen Größe wie unten:

declare @sql as nvarchar(max); 
.... 

declare @sql1 as nvarchar(max); 
... 

declare @sql2 as nvarchar(max); 
Verwandte Themen