web-dev-qa-db-ja.com

変数としてのテーブル名

私はこのクエリを実行しようとしています:

declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename

これにより、次のエラーが発生します。

メッセージ1087、レベル16、状態1、行5

テーブル変数 "@tablename"を宣言する必要があります。

テーブル名を動的に設定する正しい方法は何ですか?

139
SoftwareGeek

クエリが静的な場合、テーブル名と列名は静的である必要があります。動的なテーブル名またはカラム名の場合は、フルSQLを動的に生成し、それを実行するためにsp_executesqlを使用する必要があります。

詳細はこちら: 動的SQLの呪いと祝福

108
mdma

最後の文をこれに変更します。

EXEC('SELECT * FROM ' + @tablename)

これが、ストアドプロシージャでの作業方法です。最初のブロックは変数を宣言し、現在の年月名に基づいてテーブル名を設定します。この場合はTEST_2012OCTOBERです。それからそれがすでにDBに存在するかどうかを確認し、存在する場合は削除します。その後、次のブロックは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)
END

--CREATES TABLE FROM DYNAMIC VARIABLE AND INSERTS ROWS FROM ANOTHER TABLE
EXEC('SELECT * INTO ' + @table_name + ' FROM dbo.MASTER WHERE STATUS_CD = ''A''')
82
Tim

変数にテーブル名を使うことはできません、代わりにこれをしなければならないでしょう:

DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT * from yourtable'
EXEC (@sqlCommand)
36
dcp

ちょっと答えを遅らせますが、他の誰かを手伝うべきです:

CREATE PROCEDURE [dbo].[GetByName]
    @TableName NVARCHAR(100)
    AS
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



END
32
Atul Chaudhary

SQLを動的に生成する必要があります。

declare @tablename varchar(50) 

set @tablename = 'test' 

declare @sql varchar(500)

set @sql = 'select * from ' + @tablename 

exec (@sql)
13

SQLを実行するにはsp_executesqlを使用してください。

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.'
END

DEALLOCATE tblcur
6
ghgh

また、あなたはこれを使用することができます...

DECLARE @SeqID varchar(150);
DECLARE @TableName varchar(150);  
SET @TableName = (Select TableName from Table);
SET @SeqID = 'SELECT NEXT VALUE FOR '+ @TableName + '_Data'
exec (@SeqID)
0
Disha Sojitra