如何将SELECT语句作为参数传递给SQL Server中的存储过程?

时间:2017-02-05 12:47:58

标签: sql sql-server stored-procedures

我的代码出了什么问题?我想传递select语句和where子句变量值:

ALTER PROC sp_ac_getItemLookupCode 
    @itemlookupcode varchar(20) = null,
    @select varchar(30)
AS
BEGIN
    SELECT DISTINCTT
        @select
    FROM
        [ReportHQMatajer].[dbo].[JFC_ItemDailySalesParent] pp
    WHERE 
        ItemLookupCode LIKE @itemlookupcode+'%' 
END

以上是我的存储过程。我执行以下代码,但它只返回列Name

sp_ac_getItemLookupCode @select='ItemLookupCode',@itemlookupcode=1

它没有返回所有值。它返回列名称作为结果

3 个答案:

答案 0 :(得分:0)

使用SP_EXECUTESQL系统存储的proecures作为下一步使用动态查询: -

ALTER PROC sp_ac_getItemLookupCode 
@itemlookupcode varchar(20)= null,
@select varchar(30)
AS
BEGIN
declare @Query nvarchar(2000)
set @Query = 
    'select distinct ' + @select + '
    FROM
        [ReportHQMatajer].[dbo].[JFC_ItemDailySalesParent] pp
    WHERE 
        ItemLookupCode like ''' + @itemlookupcode+ + '%'' '
exec sp_executesql @Query
END

答案 1 :(得分:0)

如果要将列名称作为参数传递,则必须进行动态查询,如下所示: -

Exec ('select distinct '+@select+'
    FROM
        [ReportHQMatajer].[dbo].[JFC_ItemDailySalesParent] pp')

答案 2 :(得分:-1)

如果要传递列名(或表名或函数名等),则需要使用动态SQL:

ALTER PROC sp_ac_getItemLookupCode (
    @itemlookupcode varchar(20) = null,
    @select varchar(30)
) AS
BEGIN
    declare @sql = nvarchar(max);

    set @sql = '
select distinct @select
from [ReportHQMatajer].[dbo].[JFC_ItemDailySalesParent] pp
';

    set @sql = replace(@sql, '@select', @select);

    if (@itemlookupcode is not null)
    begin
        set @sql = @sql + 'where ItemLookupCode like ''' + @itemlookupcode + '%'''
    end;

    exec sp_executesql @sql;
END;

我添加了@itemlookupcodeNULL的功能,然后返回所有行。