2013-08-28 1 views
5

J'ai fait cette procédure ..je veux passer une requête de sélection dans une procédure stockée en tant argumnet

ALTER PROCEDURE [dbo].[MyProcedure] 
      @pSelect nvarchar 
AS 
BEGIN 
    SET NOCOUNT ON; 

    select @pSelect from tabel1 
END 

Je veux passer une requête de sélection comme à partir du code C# à cette procédure stockée

MyProcedure("column1,column2"); 

Comment pourrais-je faire cela parce que la procédure stockée traiter mon paramètre comme une chaîne et il se comporte comme

select N'column1,column2' from tabel1 

pls aide me

ou de fournir une meilleure option pour cette

Répondre

10

Vous devez utiliser SQL dynamique dans la procédure stockée.

ALTER PROCEDURE [dbo].[MyProcedure] 
    @pSelect nvarchar(max) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @SQL nvarchar(max) 

    SET @SQL = 'select ' + @pSelect + ' from tabel1'; 

    EXEC (@SQL) 
END 

Voici un script pour tester la procédure stockée ci-dessus:

CREATE TABLE tabel1 (id int, data varchar(50)) 
INSERT INTO tabel1 VALUES(1,'aaa'),(2,'bbb'),(3,'ccc') 

EXEC [dbo].[MyProcedure] 'id' 
EXEC [dbo].[MyProcedure] 'data' 
EXEC [dbo].[MyProcedure] 'id,data' 
+0

son nom me donnant exception colonne non valide 'c' –

+0

réponse mis à jour, vous devrez spécifier " nvarchar (max) "en tant que paramètre, pas seulement" nvarchar ", car cela le fera utiliser seulement le premier charafter de tout ce que vous passez. – TheQ

+0

j'utilise nvarchar (max) il montre toujours la même exception –

3

Vous pouvez utiliser SQL dynamique dans le but, mais il n'est pas recommandé. (Plus d'infos ici - The Curse and Blessings of Dynamic SQL)

create procedure MyProcedure 
@pSelect nvarchar 
AS 
begin 
    declare @sql nvarchar(4000); 
    set @sql='select ['+ @pSelect +'] from Table_1'; 
    exec sp_executesql @sql 
end 
go 

exec MyProcedure 'column1,column2' 
go 
0

Si votre @pSelect est d'avoir toute la requête alors:

ALTER PROCEDURE [dbo].[MyProcedure] 
      @pSelect nvarchar 
AS 
BEGIN 
    SET NOCOUNT ON;  
    -- If you [email protected] is having entire query 
    exec (@pSelect) 

    -- If you are passing only field list then following 
    DECLARE @SQL nvarchar(max) 

    SET @SQL = 'select ' + @pSelect + ' from tabel1'; 
END 
Questions connexes