복붙노트

[SQL] 변수로 테이블 이름

SQL

변수로 테이블 이름

나는이 쿼리를 실행하려고 :

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

이것은 다음과 같은 오류가 발생합니다 :

테이블 이름이 동적으로 채운 올바른 방법은 무엇입니까?

해결법

  1. ==============================

    1.쿼리가 정적 인 경우 테이블 이름과 열 이름은 정적 일 필요가있다. 동적 테이블 또는 열 이름의 경우, 동적 전체 SQL을 생성해야하며, 사용 sp_executesql을 그것을 실행.

    쿼리가 정적 인 경우 테이블 이름과 열 이름은 정적 일 필요가있다. 동적 테이블 또는 열 이름의 경우, 동적 전체 SQL을 생성해야하며, 사용 sp_executesql을 그것을 실행.

    자세한 내용은 여기 세부 정보 : 저주와 동적 SQL의 축복

  2. ==============================

    2.여기에 마지막 문을 변경 :

    여기에 마지막 문을 변경 :

    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''')
    
  3. ==============================

    3.당신은 변수의 테이블 이름을 사용할 수 없습니다, 대신이 작업을 수행해야 할 것이다 :

    당신은 변수의 테이블 이름을 사용할 수 없습니다, 대신이 작업을 수행해야 할 것이다 :

    DECLARE @sqlCommand varchar(1000)
    SET @sqlCommand = 'SELECT * from yourtable'
    EXEC (@sqlCommand)
    
  4. ==============================

    4.비트 늦게 답변을하지만 다른 사람에서 도움이 될 것입니다 :

    비트 늦게 답변을하지만 다른 사람에서 도움이 될 것입니다 :

    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
    
  5. ==============================

    5.동적 SQL을 생성해야합니다 :

    동적 SQL을 생성해야합니다 :

    declare @tablename varchar(50) 
    
    set @tablename = 'test' 
    
    declare @sql varchar(500)
    
    set @sql = 'select * from ' + @tablename 
    
    exec (@sql)
    
  6. ==============================

    6.사용이 sp_executesql에 어떤 SQL을 실행하려면, 예를 들어,

    사용이 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.'
    END
    
    DEALLOCATE tblcur
    
  7. ==============================

    7.또한, 당신은이를 사용할 수 있습니다 ...

    또한, 당신은이를 사용할 수 있습니다 ...

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

    8.

    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
            exec('Select * from '+ @Table)
            FETCH @C_Tables INTO @Table
            SELECT @fs_e = sdec.fetch_Status FROM sys.dm_exec_cursors(0) as sdec where sdec.name = '@C_Tables'
        END
    
  9. from https://stackoverflow.com/questions/2838490/table-name-as-variable by cc-by-sa and MIT license