假设我有一个这样的查询:
SELECT * FROM
(
SELECT * FROM
(
SELECT * FROM DB.dbo.Table
)
INNER JOIN DB.dbo.Table ON ...
我通过手动更改各处的字符串,对不同的表多次运行此查询。我尝试声明以下内容:
DECLARE @tablename AS VARCHAR(255)
SET @tablename = 'DB.dbo.Table'
但这似乎不起作用,因为它向我抛出一个错误,指出我需要将 @tablename
声明为表变量,然后才能使用它。如何模板化我的表名?如果可能的话,Intellisense 仍然有效吗?
最佳答案
您可以将其包装在 EXEC 语句中,如下所示:
declare @my_tablename nvarchar(100) = 'mytable';
exec('
SELECT * FROM
(
SELECT * FROM
(
SELECT * FROM ' + @my_tablename + '
)
INNER JOIN ' + @my_tablename + ' ON ...'
);
但是不,智能感知在这种情况下不起作用。
如果您提前知道输出是什么样子,那么您可以声明一个临时表来保存结果,然后您可以在没有 EXEC 的情况下访问它。您将在临时表上拥有智能感知。
例如:
--this must match whatever your SELECT is going to return
CREATE TABLE #results(
FIELD1 INT
,FIELD2 NVARCHAR(100)
,FIELD3 BIT
);
EXEC('
INSERT INTO #results(field1,field2,field3)
SELECT FIELD1,FIELD2,FIELD3 FROM ' + @my_tablename
);
select * from #results --you will have intellisense on #results
关于sql - 有没有办法将表名指定为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6877624/