【问题标题】:SQL Store a value from an EXECUTE Command into a variableSQL 将 EXECUTE 命令中的值存储到变量中
【发布时间】:2023-04-02 16:55:01
【问题描述】:

我正在尝试通过 EXECUTE 命令将值存储到变量中。我知道我想使用 sp_executesql 命令,但是网上所有的例子只会让人更加困惑。所以这就是我想要做的。

我有一个接受两个参数(表名、房间号)的存储过程。为了有一个动态表名,我在使用字符串时使用动态 SQL 样式。我正在尝试存储来自多个表的电话号码。到目前为止,我已经完成了这项工作。

DECLARE @Location   varchar(MAX);
DECLARE @Room       varchar(10);
DECLARE @Number     char(8);
DECLARE @SQLString  varchar(MAX);

SET @Location = N'CMPhone.dbo.GardenCottage';
SET @Room = N'202';

SET @SQLString ='SET @Number = (SELECT PhoneNumber FROM ' + @Location + '     WHERE Room = ''' + @Room + ''');';
PRINT(@SQLString);

OUTPUT
SET @Number = (SELECT PhoneNumber FROM CMPhone.dbo.GardenCottage WHERE Room = '202');

SET @Number = (SELECT PhoneNumber FROM CMPhone.dbo.GardenCottage WHERE Room = '202');
PRINT(@Number);

OUTPUT
123-4567 

哪个是正确的数字。现在,这就是问题所在。我需要使用动态 SQL 执行另一个查询,以便可以再次使用多个表。所以在我的存储过程中,我需要将我的 EXEC(@SQLString) 存储到一个变量 (@Number) 中,以便我可以使用该值,这就是我遇到问题的地方。我无法让 sp_executesql 将值存储到 @Number 中。另一个查询看起来像这样

SET @SQLString = ' UPDATE PhoneNumbers SET Active = ''1'' WHERE
          PhoneNumber = ''' + @Number + ''';';
EXEC(@SQLString);

如果这仍然令人困惑,或者您有任何疑问,请提出。很感谢任何形式的帮助。谢谢

更新#1:

我现在有了这个新字符串

@SQLString = 'SELECT PhoneNumber FROM ' + @Location ' + ' WHERE Room = ''' + @Room + ''';';

EXECUTE SP_EXECUTESQL @SQLString

得到正确的数字,但我不知道如何设置 OUTPUT 参数。

我正在尝试效仿微软的这个例子

DECLARE @SQLString NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500)
DECLARE @IntVariable INT
DECLARE @Lastlname varchar(30)
SET @SQLString = N'SELECT @LastlnameOUT = max(lname)
               FROM pubs.dbo.employee WHERE job_lvl = @level'
SET @ParmDefinition = N'@level tinyint,
                    @LastlnameOUT varchar(30) OUTPUT'
SET @IntVariable = 35
EXECUTE sp_executesql
@SQLString,
@ParmDefinition,
@level = @IntVariable,
@LastlnameOUT=@Lastlname OUTPUT
SELECT @Lastlname

但我不明白他们如何声明 lastlNameOUT 变量。

【问题讨论】:

  • 这里要非常小心。这对 sql 注入很开放。
  • 你可以做我认为你正在尝试的事情......使用 sp_executesql 和一个 out 参数。还有其他你不得不放弃它的原因吗?
  • 不,我知道我需要使用 sp_execturesql 和一个 out 参数,但这就是给我带来麻烦的原因。我不相信我正确使用它。我不断发现的例子非常复杂,没有提供太多关于如何使用它们的信息。
  • 听起来你的表结构搞砸了。每当您有多个具有相同结构的表时(无论@location 指的是什么),那么您就有了可疑的数据布局。
  • 这几乎与dba.stackexchange.com/questions/106215/… 完全相同。但是,我们无法关闭跨站点的重复问题。

标签: sql sql-server tsql


【解决方案1】:

像这样在EXECUTE sp_executesql 中使用输出变量:

EXECUTE sp_executesql @SQLString, N'@Number char(8) out',@Number out 然后你会从 dynamc sql 中获取 @Number 值,然后你可以在查询的其他部分使用该值。希望这会有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多