【问题标题】:Sql Declaring a variable in stored procedureSql在存储过程中声明一个变量
【发布时间】:2020-01-05 09:34:26
【问题描述】:

我已经创建了一个存储过程,我想在其中将一个 rowid 和表名从选择查询设置为一个变量,但是当我在 sql 中执行我的代码时,会出现一堆错误

我已经 decalre 一个变量,但它一直对 decalare table 说

这是我写的代码

USE [DB_A4BA76_logistic]
GO
CREATE PROCEDURE RecoverLogs @id int
AS
declare @TableName nvarchar(50)
declare @RowId int
set @TableName= ( select Logs.tableName from logs where Logs.id=@id)
set @Rowid= ( select Logs.Rowid from logs where id=@id)
Update @TableName set UpdateStatus='0' where id = @Rowid
if(select UpdateStatus from @TableName where id = @Rowid) = '0'
select 1
else
select 2
GO;

执行上述代码后出现这些错误

Msg 1087, Level 16, State 1, Procedure RecoverLogs, Line 7
Must declare the table variable "@TableName".
Msg 1087, Level 16, State 1, Procedure RecoverLogs, Line 8
Must declare the table variable "@TableName".

【问题讨论】:

  • 不能用变量/表达式来替换对象的值;它必须是文字。您必须在此处使用动态 SQL。
  • 你为什么不使用 select into ?
  • 你如何使用动态对象 @AmiraBedhiafi SELECT....INTO?
  • 我使用了 Select .... into 但仍然出现错误 SELECT Logs.tableName INTO @TableName FROM logs WHERE Logs.id=50 以下错误出现 Msg 102, Level 15, State 1, Line 1 不正确'@TableName' 附近的语法。 Msg 137, Level 15, State 2, Line 2 必须声明标量变量“@TableName”。
  • @MoiezHussain 我以为你将数据存储在表中。

标签: sql-server database tsql stored-procedures


【解决方案1】:

这有点像在黑暗中刺伤,并做出了一些假设,但我怀疑这就是你想要的。请注意,我将 SELECT 更改为 OUTPUT 参数,因为这似乎也更适合这里。

CREATE PROC dbo.RecoverLogs @id int, @status tinyint OUTPUT
AS BEGIN



    DECLARE @SQL nvarchar(MAX);

    SELECT @SQL = N'DECLARE @RI table (UpdateStatus int);' + NCHAR(13) + NCHAR(10) +
                  N'UPDATE dbo.' + QUOTENAME(tableName) + NCHAR(13) + NCHAR(10) +
                  N'SET UpdateStatus = 0' + NCHAR(13) + NCHAR(10) +
                  N'OUTPUT inserted.UpdateStatus' + NCHAR(13) + NCHAR(10) +
                  N'INTO @RI' + NCHAR(13) + NCHAR(10) +
                  N'WHERE id = ' + QUOTENAME(Rowid,'''') + N';' + NCHAR(13) + NCHAR(10) +
                  N'SELECT @status = CASE WHE UpdateStatus = 0 THEN 1 ELSE 2 END' + NCHAR(13) + NCHAR(10) +
                  N'FROM @RI;'
    FROM dbo.logs
    WHERE id = @id;

   PRINT @SQL; --Your best friend
   EXEC sp_executesql @SQL, N'@id int, @status tinyint OUTPUT', @id, @status OUTPUT;
END;

如果您遇到任何错误,请让您最好的朋友帮助您。否则,请在您的问题中发布一些示例数据和预期结果,以便我们进行测试(因为我们现在不能)。

【讨论】:

  • 你是一个救生员,谢谢你太棒了,我想要的就是这样
  • 重要的是,@MoiezHussain,你明白吗?
  • 老实说!我不明白,但我很高兴它对我有用并产生我想要的输出 XD
  • 花时间去理解它很重要。这解释了我在这里所做的事情背后的一些逻辑:Dos and Don'ts of Dynamic SQL 但是,如果有需要解释的部分,请询问。归根结底,需要能够支持上述代码的是您;不是我或 Stack Overflow 上的其他任何人。
猜你喜欢
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多