2016-06-27 1 views
0

je la modification suivante de ma procédure stockée: si je donnaisUtiliser EXEC pour créer procédure stockée pour exécuter la mise à jour colonne de chaîne dans SQL Server 2008

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spTMSA_Test_Run] 
    @TableName nvarchar(200) = 'MyTable', 
    @Parent int = 1145, 
    @Name nvarchar(100) = '''Test''', 
    @KPI nvarchar(max) = '''Test''', 
    @IDCount int = 1137 
AS 
BEGIN 
    EXEC('UPDATE ' + @TableName + ' SET Parent = ' + @Parent + ', Name = ' + @Name + ' , KPI = ' + @KPI + ' WHERE IDCount = ' + @IDCount) 
END 

Cette procédure est exécutée avec succès « » » avant et après la valeur de chaîne. Dans le cas où j'ai quitté 'avant et après la valeur de la chaîne, cela provoquera une erreur.

S'il vous plaît aidez-moi à trouver la raison et la solution. Merci

+0

Puisque votre requête est dynamique et que vous lui concattez une chaîne. Sql identifiera que c'est une chaîne quand vous l'enfermerez dans '' ' – Mani

Répondre

1

Cette procédure est une porte ouverte pour les attaques SQL injection. À moins que vous n'ayez une bonne raison d'en créer un SQL dynamique, je vous suggère de l'éviter.

Si vous ne pouvez pas éviter d'utiliser SQL dynamique, le moins que vous puissiez faire est d'utiliser quotename pour garder votre procédure un peu plus sûre.

En ce qui concerne le problème que vous dites dans votre question - il suffit de déplacer le ''' au corps de la requête:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spTMSA_Test_Run] 
    @TableName nvarchar(200) = 'MyTable', 
    @Parent int = 1145, 
    @Name nvarchar(100) = 'Test', 
    @KPI nvarchar(max) = 'Test', 
    @IDCount int = 1137 
AS 
BEGIN 

    EXEC('UPDATE QUOTENAME(' + @TableName + ') 
      SET Parent = ' + @Parent + ', 
       Name = ''' + @Name + ''' , 
       KPI = ''' + @KPI + ''' 
      WHERE IDCount = ' + @IDCount) 
END 
+0

Merci Zohar, – user3717655

0
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spTMSA_Test_Run] 
    @TableName nvarchar(200) = 'MyTable', 
    @Parent int = 1145, 
    @Name nvarchar(100) = '''Test''', 
    @KPI nvarchar(max) = '''Test''', 
    @IDCount int = 1137 
AS 
BEGIN 

  declare @sql nvarchar(4000) 
  set @sql='UPDATE ' + @TableName + ' SET Parent = ' + @Parent + ', Name = ' + @Name + ' , KPI = ' + @KPI + ' WHERE IDCount = ' + @IDCount 
  print @sql --find reason in the sql statement 
    EXEC(@sql) 
END 
0

Je suggère d'utiliser sp_executesql et CAST int à nvarchar avant d'exécuter la requête et QUOTENAME la @tablename .

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spTMSA_Test_Run] 
    @TableName nvarchar(200), 
    @Parent int, 
    @Name nvarchar(100), 
    @KPI nvarchar(max), 
    @IDCount int 
AS 
BEGIN 

    DECLARE @sql nvarchar(max) 

    SELECT @sql = ' 
     UPDATE ' + QUOTENAME(@TableName) + ' 
     SET Parent = ' + CAST(@Parent as nvarchar(10))+ ', 
      Name = ''' + @Name + ''', 
      KPI = ''' + @KPI + ''' 
     WHERE IDCount = ' + CAST(@IDCount as nvarchar(10)) + ';' 


    EXEC sp_executesql @sql 

END