我目前在编写存储过程时遇到问题,并将int类型变量的值设置为带有变量作为表名的select语句的结果。我看过旧线程并尝试了多种方法,但没有运气。如果我没有收到有关表名的错误,我最终会收到有关变量转换问题的错误。我一直在研究这个问题太久了,任何帮助都会受到赞赏。下面是我的代码的一部分。感谢
DECLARE @BATCHNUMBER VARCHAR --value set in earlier code
DECLARE @ETABLE VARCHAR(50); --the table name
DECLARE @FIRSTDOCID INT;
SET @ETABLE = 'tablename_' + @BATCHNUMBER; --CREATE FIRST TABLE NAME
SELECT @FIRSTDOCID = MIN(D0CID) FROM @ETABLE
我得到的错误是:必须声明表变量“@ETABLE”
答案 0 :(得分:1)
您正在尝试从VARCHAR
中选择,而不是从表中进行选择。使这项工作的唯一方法是使用动态SQL。
DECLARE @SQL NVARCHAR(250);
SET @SQL = 'SELECT @OUTPUT = MIN(D0CID) FROM ' + QuoteName(@ETABLE);
EXEC sp_executeSql @SQL, N'@output INT OUTPUT', @FIRSTDOCID OUTPUT;
SELECT @FIRSTDOCID;
但是,我不建议使用动态SQL,因为这通常会导致SQL注入。
答案 1 :(得分:0)
如果您正在动态构建查询,则可能需要执行类似exec
的操作:
SET @QUERY = "SELECT" + ...etc.
exec(@QUERY)
由于ETABLE
是一个varchar,而不是预期的“表变量”。