Sql 如何创建一个存储过程,其中我要“从中选择”的列是动态的?

Sql 如何创建一个存储过程,其中我要“从中选择”的列是动态的?,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我有一个“概念”问题。我了解如何创建带有参数的简单存储过程 我现在的问题是,如何编写一个存储过程,以便我要选择的列。。。从中可以看出,它们是动态的 示例运行1:我只想运行一个存储过程 SELECT firstName, LastName SELECT firstName, LastName, Department 示例运行2:我只想运行一个存储过程 SELECT firstName, LastName SELECT firstName, LastName, Department 每次运行

我有一个“概念”问题。我了解如何创建带有参数的简单存储过程

我现在的问题是,如何编写一个存储过程,以便我要选择的列。。。从中可以看出,它们是动态的

示例运行1:我只想运行一个存储过程

SELECT firstName, LastName
SELECT firstName, LastName, Department
示例运行2:我只想运行一个存储过程

SELECT firstName, LastName
SELECT firstName, LastName, Department
每次运行存储过程时,要选择的列列表可能会更改

我有一个现有的存储过程_SelectFromQry,它是这样写的:

ALTER PROCEDURE [dbo].[_SelectFromQry] 
    @queryname NVARCHAR(255)
AS
BEGIN
    SELECT TBLNAME, TBLCOL, TBLCOLLABEL, POSITION
    FROM QRY
    WHERE QUERYNAME = @queryname
END
上述过程的结果是我要从另一个表中选择的“动态列”

我不清楚如何编写一个存储过程,根据“\u SelectFromQry”的结果从另一个表中进行选择。它是否会涉及到创建某种“列表参数”,我将从@list中进行选择


谢谢你的帮助

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

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

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

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'

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

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'

无论是通过IF-ELSE还是通过dynamicsqlif-ELSE还是通过dynamicsqlproblem都不同意不要这样做。所有语言都提供了一些功能,使您能够处理有时复杂的情况。在某些情况下,动态SQL是最后的手段,它可以避免实现一系列不可读的IF-THEN-else。所以,是的,它可以被明智地使用。我同意这个答案。在某些情况下,动态SQL肯定是有用和可取的。这不是那种情况。有更好的方法来过滤某人想要使用的列,例如简单地使用表值函数或视图,并在调用者级别选择所需的列。混淆视图和函数的存储过程只是草率或无知。不同意,永远不要这样做。所有语言都提供了一些功能,使您能够处理有时复杂的情况。在某些情况下,动态SQL是最后的手段,它可以避免实现一系列不可读的IF-THEN-else。所以,是的,它可以被明智地使用。我同意这个答案。在某些情况下,动态SQL肯定是有用和可取的。这不是那种情况。有更好的方法来过滤某人想要使用的列,例如简单地使用表值函数或视图,并在调用者级别选择所需的列。混淆视图和函数的存储过程只是草率或无知。您有一个错误。要执行SELECT字符串,它应该是execute sp_executesql@query。请问表名是否也可以是参数?@jinchengteo yes。整个SELECT语句可以是字符串的一部分。事实上,这种方法允许您执行几乎任何可以用SQL编码的操作,包括一个完整的匿名块,即BEGIN…END。因此,在我对olk发布的解决方案发表评论之后,请注意您在其中的内容。您有一个错误。要执行SELECT字符串,它应该是execute sp_executesql@query。请问表名是否也可以是参数?@jinchengteo yes。整个SELECT语句可以是字符串的一部分。事实上,这种方法允许您执行几乎任何可以用SQL编码的操作,包括一个完整的匿名块,即BEGIN…END。因此,在我对olk发布的解决方案发表评论之后,请注意您在其中添加的内容。