如何在使用变量的 select 查询中使用 SQL Server 表名?

7

这个是否不正确,我们不能将表名动态地传递给选择查询吗?

这会给我一个错误'Must declare the table variable @TblName'

DECLARE @TblName VARCHAR(30)
SET @TblName = 'User'
SELECT * 
FROM @TblName

可能是表名作为变量的重复问题. - underscore_d
3个回答

14

您需要创建一个动态的SQL查询,最好使用QUOTENAME函数。通过使用QUOTENAME函数,可以避免来自恶意输入的任何问题。

这是一个示例脚本,说明如何通过传递表名创建动态SQL查询来查询表格。您可以将表名更改为变量@tablename的值。

用于示例的创建和插入脚本:

CREATE TABLE sample
(
    id INT NOT NULL
);

INSERT INTO sample (id) VALUES
  (1),
  (2),
  (3),
  (4),
  (5),
  (6);

动态SQL脚本:

DECLARE @execquery AS NVARCHAR(MAX)
DECLARE @tablename AS NVARCHAR(128)

SET @tablename = 'sample'
SET @execquery = N'SELECT * FROM ' + QUOTENAME(@tablename)

EXECUTE sp_executesql @execquery

演示:

点击此处在SQL Fiddle中查看演示。

建议阅读:

动态SQL的诅咒和祝福


1

你需要使用 dynamic SQL 执行

将你的语句包装在 @selectstr

使用 exec sp_executesql @selectstr


1
sp_executesql的参数需要是nvarchar/nchar/ntext。 - Gratzy
3
“只是给别人动态SQL的代码却完全不解释,这真的是一个糟糕的想法。” “这就像是给某人一把枪,希望他不要射自己。” - JNK
非常感谢@Sive提供的答案,下次我会学习的 :) - Turbot

0

您可以使用动态查询来完成此操作,请参见以下内容

DECLARE @TblName VARCHAR(30)

DECLARE @vQuery NVARCHAR(100)

SET @TblName = 'User'

SET @vQuery = 'SELECT * FROM ' + @TblName

EXECUTE sp_executesql @vQuery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接