添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

有什么正确的方法可以让表名动态填充?

sql
sql-server
tsql
variable-names
tablename
SoftwareGeek
SoftwareGeek
发布于 2010-05-15
10 个回答
mdma
mdma
发布于 2021-01-20
已采纳
0 人赞同

对于静态查询,像你问题中的那个,表名和列名需要是静态的。

对于动态查询,你应该动态地生成完整的SQL,并使用sp_executesql来执行。

下面是一个用于比较不同数据库的相同表之间数据的脚本例子。

静态查询。

SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]

由于我想很容易地改变tableschema 的名称,我创建了这个动态查询。

declare @schema varchar(50)
declare @table varchar(50)
declare @query nvarchar(500)
set @schema = 'dbo'
set @table = 'ACTY'
set @query = 'SELECT * FROM [DB_ONE].[' + @schema + '].[' + @table + '] EXCEPT SELECT * FROM [DB_TWO].[' + @schema + '].[' + @table + ']'
EXEC sp_executesql @query

由于动态查询有很多细节需要考虑,而且很难维护,我建议你阅读。动态SQL的诅咒和祝福

HABO
在将对象名称组合成动态SQL语句时,最好的做法是使用 QuoteName() 以避免奇怪的名字带来的问题,例如: New Table 与空格或保留字,如 From
Tim
Tim
发布于 2021-01-20
0 人赞同

把你的最后一句话改成这样。

EXEC('SELECT * FROM ' + @tablename)

我在存储过程中是这样做的。第一个块将声明这个变量,并根据当前的年和月的名称设置表的名称,在这个例子中是TEST_2012OCTOBER。然后,我检查它是否已经存在于数据库中,如果存在,则将其删除。然后,下一个块将使用SELECT INTO语句来创建表,并从另一个带有参数的表中填充记录。

--DECLARE TABLE NAME VARIABLE DYNAMICALLY
DECLARE @table_name varchar(max)
SET @table_name =
    (SELECT 'TEST_'
            + DATENAME(YEAR,GETDATE())
            + UPPER(DATENAME(MONTH,GETDATE())) )
--DROP THE TABLE IF IT ALREADY EXISTS
IF EXISTS(SELECT name
          FROM sysobjects
          WHERE name = @table_name AND xtype = 'U')
BEGIN
    EXEC('drop table ' +  @table_name)
--CREATES TABLE FROM DYNAMIC VARIABLE AND INSERTS ROWS FROM ANOTHER TABLE
EXEC('SELECT * INTO ' + @table_name + ' FROM dbo.MASTER WHERE STATUS_CD = ''A''')
    
这是最好的答案。
B H
这是最好的答案,因为它是最直接适用于OP的现有代码。
Atul Chaudhary
Atul Chaudhary
发布于 2021-01-20
0 人赞同
CREATE PROCEDURE [dbo].[GetByName]
    @TableName NVARCHAR(100)
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @sSQL nvarchar(500);
    SELECT @sSQL = N'SELECT * FROM' + QUOTENAME(@TableName);
    EXEC sp_executesql @sSQL
    
QUOTENAME对安全很重要。谢谢。
但如何从这样的查询中返回值?例如: COUNT(*) ?
@Suncatcher 你可以有一个输出参数,或者把它作为一个结果集返回。为了说明如何将它读入一个变量,并且由于评论发布的限制,在变量上没有领先的'at'符号: declare nCount int Exec('select nCount = count(*) from ' + sTableName)
dcp
dcp
发布于 2021-01-20
0 人赞同

你不能用一个表名来表示一个变量。你必须这样做。

DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT * from yourtable'
EXEC (@sqlCommand)
    
Paul Kearney - pk
Paul Kearney - pk
发布于 2021-01-20
0 人赞同

你需要动态地生成SQL内容。

declare @tablename varchar(50)
set @tablename = 'test'
declare @sql varchar(500)
set @sql = 'select * from ' + @tablename
exec (@sql)
    
ghgh
ghgh
发布于 2021-01-20
0 人赞同

使用 sp_executesql 来执行任何SQL,例如:

DECLARE @tbl    sysname,
        @sql    nvarchar(4000),
        @params nvarchar(4000),
        @count  int
DECLARE tblcur CURSOR STATIC LOCAL FOR
   SELECT object_name(id) FROM syscolumns WHERE name = 'LastUpdated'
   ORDER  BY 1
OPEN tblcur
WHILE 1 = 1
BEGIN
   FETCH tblcur INTO @tbl
   IF @@fetch_status <> 0
      BREAK
   SELECT @sql =
   N' SELECT @cnt = COUNT(*) FROM dbo.' + quotename(@tbl) +
   N' WHERE LastUpdated BETWEEN @fromdate AND ' +
   N'                           coalesce(@todate, ''99991231'')'
   SELECT @params = N'@fromdate datetime, ' +
                    N'@todate   datetime = NULL, ' +
                    N'@cnt      int      OUTPUT'
   EXEC sp_executesql @sql, @params, '20060101', @cnt = @count OUTPUT
   PRINT @tbl + ': ' + convert(varchar(10), @count) + ' modified rows.'
DEALLOCATE tblcur
    
这个例子非常有用。
Reza Jenabi
Reza Jenabi
发布于 2021-01-20
0 人赞同

你需要使用SQL Server动态SQL。

DECLARE @table     NVARCHAR(128),
        @sql       NVARCHAR(MAX);
SET @table = N'tableName';
SET @sql = N'SELECT * FROM ' + @table;

使用EXEC来执行任何SQL。

EXEC (@sql)

使用EXEC sp_executesql来执行任何SQL。

EXEC sp_executesql @sql;

使用EXECUTE sp_executesql来执行任何SQL。

EXECUTE sp_executesql @sql
    
user13581111
user13581111
发布于 2021-01-20
0 人赞同
Declare  @tablename varchar(50) 
set @tablename = 'Your table Name' 
EXEC('select * from ' + @tablename)
    
欢迎来到Stack Overflow!虽然这段代码可能会解决这个问题,但 包括解释 如何以及为什么会解决这个问题,将真正有助于提高你的帖子的质量,并可能导致更多的支持率。记住,你是在为未来的读者回答问题,而不仅仅是现在的提问者。请 编辑 你的答案,增加解释,并说明有哪些限制和假设适用。 来自评论
我喜欢这个答案的简单性,它有问题所涉及的3条线。 我认为不需要解释。谢谢你。
Disha Sojitra
Disha Sojitra
发布于 2021-01-20
0 人赞同

此外,你可以用这个...

DECLARE @SeqID varchar(150);
DECLARE @TableName varchar(150);
SET @TableName = (Select TableName from Table);
SET @SeqID = 'SELECT NEXT VALUE FOR ' + @TableName + '_Data'
exec (@SeqID)
    
Laurent
Laurent
发布于 2021-01-20
0 人赞同
Declare @fs_e int, @C_Tables CURSOR, @Table varchar(50)
SET @C_Tables = CURSOR FOR
        select name from sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1 AND name like 'TR_%'
OPEN @C_Tables
FETCH @C_Tables INTO @Table
    SELECT @fs_e = sdec.fetch_Status FROM sys.dm_exec_cursors(0) as sdec where sdec.name = '@C_Tables'
WHILE ( @fs_e <> -1)
    BEGIN