5

我做了这个程序..

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

    select @pSelect from tabel1
END

我想将选择查询(例如从 c# 代码中)传递给此存储过程

MyProcedure("column1,column2");

我怎么能这样做,因为存储过程将我的参数视为一个字符串,它的行为就像

select N'column1,column2' from tabel1

请帮助我

或为此提供更好的选择

4

3 回答 3

11

您必须在存储过程中使用动态 sql。

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

这是一个测试上述存储过程的脚本:

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'
于 2013-08-28T05:25:58.830 回答
3

您可以为此目的使用动态 SQL,但不建议这样做。(更多信息在这里 -动态 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
于 2013-08-28T05:27:58.880 回答
0

如果您@pSelect有完整的查询,那么:

ALTER PROCEDURE [dbo].[MyProcedure]
            @pSelect nvarchar
AS
BEGIN
    SET NOCOUNT ON;    
    -- If you are@pSelect 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
于 2013-08-28T05:29:38.670 回答