2017-10-20 8 views
0

suis incapable d'insérer l'enregistrement lorsque donné tous les noms de colonnes insertserveur SQL procédure stockée insert avec exec dynamique

Voici la 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 

sélectionnez @counts comme compte

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 

L'enregistrement est inséré lorsque les noms de colonne sont supprimés mais ne fonctionne pas avec les noms de colonne lors de l'insertion.

Aidez-nous s'il vous plaît.

Merci

+0

@ sql1 que déclare nvarchar (50) Est-dat assez longtemps pour que la requête dynamique? –

+0

Merci frederik-de-clercq Je l'ai fait max et son fonctionnement .. l'erreur apparaissait à la ligne 1 de la commande exec .. était vraiment frustré. Merci beaucoup – Santhosh

Répondre

1

Il est préférable d'utiliser un nvarchar (max) pour les requêtes dynamiques avec des paramètres. Parce que vous ne savez jamais combien de temps la chaîne peut être. sauf si vous connaissez la longueur maximale de la corde. Un dba m'a également dit d'utiliser N 'comme préfixe avant la chaîne pour désigner les littéraux de chaîne Unicode.

0

les variables @sql Augmenter la taille comme ci-dessous:

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

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

declare @sql2 as nvarchar(max);