gpt4 book ai didi

sql-server - 无法将列名作为参数传递给 sp_executesql

转载 作者:行者123 更新时间:2023-12-03 02:26:52 26 4
gpt4 key购买 nike

我在执行下面的代码时遇到问题,它给出了如下错误:

Msg 102, Level 15, State 1, Line 3 Incorrect syntax near '@ST'.

我可以尝试使用动态 SQL 实现登录,但想尝试 sp_executesql 方法。如果我遇到语法错误或者我不应该将表名作为参数传递,请告诉我?

DECLARE @SQL NVARCHAR(4000)= '';
SET @SQL = N'--INSERT INTO #missingkeys ( SOURCE_KEY,[ROWCOUNT] )
SELECT S.[SOURCE_KEY], COUNT(1) AS [ROWCOUNT] FROM (SELECT DISTINCT @SK AS [SOURCE_KEY]
FROM [PDA].@ST ) AS S
LEFT JOIN [PDA].@MT AS T
ON T.[SOURCE_KEY] = S.[SOURCE_KEY]
GROUP BY S.[SOURCE_KEY]';
DECLARE @SOURCETABLE NVARCHAR(255)= 'FACT';
DECLARE @SOURCE_KEY NVARCHAR(255)= 'KEY', @MAP_TABLE NVARCHAR(255)= 'DimMap';
EXEC sp_executesql
@SQL,
N'@SK nvarchar(255), @ST nVARCHAR(255), @MT nVARCHAR(255)',
@SK = @SOURCE_KEY,
@ST = @SOURCETABLE,
@MT = @MAP_TABLE;

最佳答案

您不能将列作为参数,对于任何对象名称(表、存储过程等)都是如此。

您必须使语句动态化,即格式化 SQL 字符串中的列名称:

SET @SQL = 
N'SELECT '+
'S.[SOURCE_KEY],'+
'COUNT(1) AS [ROWCOUNT] '+
'FROM ('+
'SELECT DISTINCT '+
QUOTENAME(@SK)+' AS [SOURCE_KEY] '+
'...'; -- the rest of your statement

PS:使用QUOTENAME转义对象名称以避免 SQL 注入(inject)。

关于sql-server - 无法将列名作为参数传递给 sp_executesql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48335319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com