1

我目前在编写存储过程并将 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”

4

2 回答 2

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 注入。

于 2013-03-04T16:46:58.000 回答
0

exec如果您正在动态构建查询,您可能必须执行类似 use的操作:

SET @QUERY = "SELECT" + ...etc.
exec(@QUERY)

因为ETABLE是 varchar,而不是预期的“表变量”。

于 2013-03-04T16:47:50.070 回答