2013-08-28 12 views
5

zrobiłem tę procedurę ..chcę przekazać kwerendę wybierającą w procedurze przechowywanej jako argumnet

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

    select @pSelect from tabel1 
END 

Chcę przekazać kwerendę wybierającą jak z kodu C# do tej procedury przechowywanej

MyProcedure("column1,column2"); 

jak mogłem to zrobić, ponieważ procedura przechowywana traktuję jako parametr ciąg i zachowuje się jak

select N'column1,column2' from tabel1 

pls help mi

lub zapewnić lepszą opcją dla tego

Odpowiedz

10

musisz użyć dynamicznego SQL wewnątrz procedury przechowywanej.

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 

Oto skrypt, aby przetestować powyższą procedurę przechowywaną:

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

jej daje mi wyjątek Nieprawidłowa kolumna name „c” –

+0

Odpowiedź zaktualizowane, będziesz musiał określić " nvarchar (max) "jako parametr, nie tylko" nvarchar ", ponieważ spowoduje to, że będzie używał tylko pierwszej wartości niezależnie od tego, co przekazujesz. – TheQ

+0

Używam nvarchar (max) nadal pokazuje ten sam wyjątek –

3

Można użyć dynamicznego SQL do tego celu, ale nie jest to zalecane. (Więcej informacji tutaj - 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

Jeśli @pSelect jest o całe zapytanie następnie:

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 
Powiązane problemy