如何创建一个存储过程,其中我想要的列是' SELECT FROM'动态吗?

时间:2018-05-22 04:34:24

标签: sql sql-server stored-procedures

我有一个概念性的'题。我理解如何使用参数创建一个简单的存储过程。

我现在的问题是,如何编写存储过程,使我想要SELECT ... FROM的列是动态的。

示例运行1:我想仅通过

运行存储过程
SELECT firstName, LastName

示例运行2:我只想通过

运行存储过程
SELECT firstName, LastName, Department

每次运行存储过程时,我希望SELECT列出的列都可以更改。

我有一个现有的存储过程(_SelectFromQry),如下所示:

ALTER PROCEDURE [dbo].[_SelectFromQry] 
    @queryname NVARCHAR(255)
AS
BEGIN
    SELECT TBLNAME, TBLCOL, TBLCOLLABEL, POSITION
    FROM QRY
    WHERE QUERYNAME = @queryname
END

上述程序的结果是'动态列'我想从另一张桌子SELECT

我不清楚如何根据' _SelectFromQry'的结果编写SELECT FROM another table的存储过程。它是否涉及创建某种列表参数'在哪里我会从@LIST中选择?

欣赏任何形式的帮助。

2 个答案:

答案 0 :(得分:2)

您的概念问题有一个简单的概念性答案:不要这样做,至少对于传统的SQL Server。这种动态性打破了基于执行计划和统计的查询执行优化的内部机制。

答案 1 :(得分:1)

我想可能有简单的方法可以做到这一点,例如

ALTER PROCEDURE [dbo].[_SelectFromQry] @columns nvarchar(MAX), @filtercolumn1 NVARCHAR(10)
AS
BEGIN
    DECLARE @query NVARCHAR (MAX)

    SET @query = N'SELECT '+@columns+' FROM TABLE 
    WHERE column1 = '+@filtercolumn1

    EXECUTE sp_executesql @query
END

执行

EXEC _SelectFromQry 'Column1,Column2,...', 'A'