2010-11-30 12 views
0

si je veux écrire une procédure comme ci-dessous, est-il un autre moyen que, pour éviter d'utiliser l'instruction SQL concaténer, je ai juste peur, si l'entrée est trop longue, dépasser la limite de max varchar, le code aura gros problème.Comment écrire requête SQL Batch dans la procédure

Merci

CREATE PROCEDURE UPDATE_ALL_STATUS 
    @IDs varchar(MAX) = null, 
    @status int = null 
AS 
BEGIN 
    IF @IDs is null 
    BEGIN 
     RETURN 
    END 

    DECLARE @SQL VARCHAR(MAX) 

    SET @SQL = 'UPDATE mytable SET status = ' + @status + ' WHERE id in (' + @IDs + ')' 
    EXECUTE @SQL 
END 

Répondre

4

au lieu de SQL dynamique (qui est aussi vulnérable à SQL Injection Attacks) et passant dans un VARCHAR (MAX), utilisez Table Valued Parameters:

-- Creates the TVP type - only needed once! 
CREATE TYPE IntegerTableType AS TABLE 
(Identities INT); 
GO 

CREATE PROCEDURE UPDATE_ALL_STATUS 
    @IDs IntegerTableType READONLY, 
    @status int = null 
AS 
BEGIN 

    UPDATE mytable 
    SET status = @status 
    WHERE id IN 
    (SELECT Identities FROM @IDs) 

END 

This MSDN article montre comment appeler ces à partir de votre code .NET.

+1

Bonjour Oded, merci beaucoup pour la réponse. Une autre question, après avoir créé le nouveau type, dans le code C#, j'ai besoin d'utiliser l'instruction SQL pour invoquer cette procédure, mais comment mon code peut-il connaître le nouveau type ??? – jojo

+0

@shrimpy - Il y en a plusieurs exemples ici: http://msdn.microsoft.com/fr-fr/library/bb675163.aspx – Oded