存储在列中的 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;
如果您想将所有语句的结果检索到一个结果集中,并且如果列 id
和 name
具有兼容的数据类型,您可以执行下一条语句(可能 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
我希望能够获取存储在列中的查询结果,并按另一列中的值进行参数化。模型更相关(查询在 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;
如果您想将所有语句的结果检索到一个结果集中,并且如果列 id
和 name
具有兼容的数据类型,您可以执行下一条语句(可能 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