存储在列中的 EXEC 查询

EXEC query stored in a column

我希望能够获取存储在列中的查询结果,并按另一列中的值进行参数化。模型更相关(查询在 1--n 链接 table 中),但为了简单起见:

value | query
------------- 
25    | SELECT id, name FROM courses
12    | SELECT id, name FROM countries

我希望能够得到查询的结果,所以像

SELECT EXEC(query + ' WHERE id = ' + value) FROM table

我想在没有应用程序端的情况下这样做。

可能吗?

PS: SQL 注入的风险没有发挥作用,它已经得到控制。

一种可能的方法是为所有可能的 SELECT 语句生成并执行动态语句。

Table:

CREATE TABLE #Statements (
    [value] int,
    [query] nvarchar(max)
)
INSERT INTO #Statements 
   ([value], [query])
VALUES
    (25, N'SELECT id, name FROM courses'),
    (12, N'SELECT id, name FROM countries')

T-SQL:

DECLARE @stm nvarchar(max) = N''
SELECT @stm = (
   SELECT 
      CONCAT(
         [query],
         N' WHERE id = ',
         [value],
         N'; '
      )
   FROM #Statements
   FOR XML PATH('')
   )
PRINT @stm
EXEC sp_executesql @stm

生成的语句:

SELECT id, name FROM courses WHERE id = 25; 
SELECT id, name FROM countries WHERE id = 12; 

如果您想将所有语句的结果检索到一个结果集中,并且如果列 idname 具有兼容的数据类型,您可以执行下一条语句(可能 CONVERT 调用):

DECLARE @stm nvarchar(max) = N''
SELECT @stm = STUFF(
   (    
   SELECT 
      CONCAT(
         N'UNION ALL ',
         [query],
         N' WHERE id = ',
         [value],
         N' '
      )
   FROM #Statements
   FOR XML PATH('')
   ),
   1, 10, N'')
PRINT @stm
EXEC sp_executesql @stm