변수로서의 테이블 이름
이 쿼리를 실행하려고 합니다.
declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename
이로 인해 다음 오류가 발생합니다.
메시지 1087, 레벨 16, 스테이트 1, 라인 5
테이블 변수 "@tablename"을 선언해야 합니다.
테이블 이름을 동적으로 입력하는 올바른 방법은 무엇입니까?
질문의 쿼리와 같은 정적 쿼리의 경우 테이블 이름과 열 이름은 정적이어야 합니다.
동적 쿼리의 경우 전체 SQL을 동적으로 생성하고 sp_executesql을 사용하여 실행해야 합니다.
다음으로 서로 다른 데이터베이스의 동일한 테이블 간에 데이터를 비교하기 위해 사용되는 스크립트의 예를 나타냅니다.
정적 쿼리:
SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]
이름을 쉽게 바꾸고 싶기 때문에table그리고.schema다음 동적 쿼리를 만들었습니다.
declare @schema sysname;
declare @table sysname;
declare @query nvarchar(max);
set @schema = 'dbo'
set @table = 'ACTY'
set @query = '
SELECT * FROM [DB_ONE].' + QUOTENAME(@schema) + '.' + QUOTENAME(@table) + '
EXCEPT
SELECT * FROM [DB_TWO].' + QUOTENAME(@schema) + '.' + QUOTENAME(@table);
EXEC sp_executesql @query
동적 쿼리는 고려해야 할 세부 사항이 많고 유지보수가 어렵기 때문에 다음을 읽어보기를 권장합니다.동적 SQL의 폐해와 장점
마지막 문장을 다음과 같이 변경합니다.
EXEC('SELECT * FROM ' + @tablename)
스토어드 프로시저에서는 이렇게 하고 있습니다.첫 번째 블록은 변수를 선언하고 현재 연도 및 월 이름을 기준으로 테이블 이름을 설정합니다(이 경우 TEST_2012OCTER).그런 다음 데이터베이스에 이미 존재하는지 확인하고, 존재한다면 제거합니다.그런 다음 다음 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''')
용도:
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
변수에 테이블 이름을 사용할 수 없습니다.대신 다음을 수행해야 합니다.
DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT * from yourtable'
EXEC (@sqlCommand)
SQL 콘텐츠를 동적으로 생성해야 합니다.
declare @tablename varchar(50)
set @tablename = 'test'
declare @sql varchar(500)
set @sql = 'select * from ' + @tablename
exec (@sql)
사용하다sp_executesqlSQL을 실행할 수 있습니다.
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
SQL Server 동적 SQL을 사용해야 합니다.
DECLARE @table NVARCHAR(128),
@sql NVARCHAR(MAX);
SET @table = N'tableName';
SET @sql = N'SELECT * FROM ' + @table;
임의의 SQL을 실행하려면 EXEC을 사용합니다.
EXEC (@sql)
임의의 SQL을 실행하려면 EXEC sp_executesql을 사용합니다.
EXEC sp_executesql @sql;
SQL을 실행하려면 EXECUTE sp_executesql을 사용합니다.
EXECUTE sp_executesql @sql
Declare @tablename varchar(50)
set @tablename = 'Your table Name'
EXEC('select * from ' + @tablename)
그리고 이걸 쓰시면...
DECLARE @SeqID varchar(150);
DECLARE @TableName varchar(150);
SET @TableName = (Select TableName from Table);
SET @SeqID = 'SELECT NEXT VALUE FOR ' + @TableName + '_Data'
exec (@SeqID)
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
언급URL : https://stackoverflow.com/questions/2838490/a-table-name-as-a-variable
'programing' 카테고리의 다른 글
| 앞뒤로 검색하려면 어떻게 해야 하나요? (0) | 2023.04.13 |
|---|---|
| SQL Server로 CSV 파일 Import (0) | 2023.04.08 |
| SQL 쿼리가 1개인 데이터베이스에서 모든 테이블을 삭제하려면 어떻게 해야 합니다. (0) | 2023.04.08 |
| SQL JOIN과 IN의 퍼포먼스 비교 (0) | 2023.04.08 |
| SQL Server 로컬 및 글로벌 임시 테이블 (0) | 2023.04.08 |