sql – 有没有办法将表名指定为字符串?

我们说我有这样的查询
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 ...'
);

但不,intellisense在那种情况下不起作用.

如果您事先知道输出的样子,那么您可以声明一个临时表来保存结果,然后您可以在没有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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...