2013-08-28 11 views
5

Ho fatto questa procedura ..Voglio passare una query di selezione in una stored procedure come un argumnet

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

    select @pSelect from tabel1 
END 

voglio passare una query di selezione, come da codice C# per questa stored procedure

MyProcedure("column1,column2"); 

come potrei fare questo perché stored procedure trattare il mio parametro come una stringa e si comporta come

select N'column1,column2' from tabel1 

pls aiuto Mi

o fornire una soluzione migliore per questo

risposta

10

Dovrete utilizzare SQL dinamico all'interno della stored procedure.

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 

Ecco uno script per testare la stored procedure di cui sopra:

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

sua avermi dato eccezione di colonna non valido nome di 'c' –

+0

risposta aggiornato, si dovrà specificare " nvarchar (max) "come parametro, non solo" nvarchar ", dal momento che renderà utilizzabile solo il primo charafter di qualunque cosa tu passi. – TheQ

+0

io uso nvarchar (max) sta ancora mostrando la stessa eccezione –

3

È possibile utilizzare SQL dinamico per lo scopo, ma non è consigliabile. (Maggiori informazioni qui - 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

Se il @pSelect sta avendo tutta la domanda quindi:

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 
Problemi correlati