2011-04-26 4 views
2

을 감안할 때 다음 코드 (MS SQL)를 매개 변수로 : 지금까지 공상열 이름 및/또는 테이블 이름

DECLARE UpdateList CURSOR FOR 
SELECT MyColumn FROM MyTable 
OPEN UpdateList 

아무것도. 이제 저는 열과 테이블의 이름을 쓸 수있는 두 개의 변수를 선언하고 싶습니다. 다음은 물론 작동하지 않을 것입니다. 이것을 어떻게 할 수 있습니까? 당신은 테이블 또는 열 이름과 같은 매개 변수를 사용할 수 없습니다 - 어떤 계약 및 프로모션 추천 자료 비즈니스 디렉토리 리뷰에 대한

DECLARE @TableName nchar(20) = 'MyTable' 
DECLARE @ColumnName nchar(20) = 'MyColumn' 
DECLARE UpdateList CURSOR FOR 
SELECT @ColumnName FROM @TableName 
OPEN UpdateList 

들으 sl3dg3는

+2

당신은 조사해야합니다 [동적 SQL (http://www.sommarskog.se/dynamic_sql.html) –

답변

4

당신은 동적 SQL을 사용해야합니다. 그래서 같은 : 동적 SQL과 관련된

CREATE TABLE #temp (newcol nvarchar(500)) -- Use the type you're getting out of @TableName 
DECLARE @TableName nchar(20) = 'MyTable' 
DECLARE @ColumnName nchar(20) = 'MyColumn' 

EXEC('INSERT INTO #temp SELECT [' + @ColumnName + '] FROM [' + @TableName + ']') 

DECLARE UpdateList CURSOR FOR 
SELECT newcol FROM #temp 
OPEN UpdateList 

명심하시기 바랍니다 보안 및 성능 문제는 - 당신이 여기에, 변수를 채우는됩니다 방법을 알고하지 않으며, 일을 몇 가지 분명한 위험이 될 수 있습니다 이.

편집 : 전체 코드가 추가되었습니다.

+0

들으 - 그건 내 개인적인 용도에만 스크립트, 여기 그래서 아무 보안 위험이 있습니다. 이것을 커서와 함께 사용하는 방법을 보여줄 수 있습니까? – sl3dg3

+0

추가됨 - 동적 테이블에서 동적 테이블을 만들면 임시 테이블을 만들어야 테이블을 선택할 수 있습니다. 커서를 사용하면 전역 커서를 사용하지 않는 한 테이블을 볼 수 없습니다. –

+0

멋지다 - 단지 'newcol'을 웬일인지 선택할 수 없다!? select 문 (두 번째 행)에서 다음과 같은 오류가 발생합니다 :'잘못된 열 이름 'newcol'. ' – sl3dg3

0

이 코드는 @statement에 '+'를 사용할 수 없으므로 커서가있는 동적 열에 대한 아주 좋은 샘플입니다.

ALTER PROCEDURE dbo.spTEST 
AS 
    SET NOCOUNT ON 
    DECLARE @query NVARCHAR(4000) = N'' 
    DECLARE @inputList NVARCHAR(4000) = '' 
    DECLARE @field sysname = 'fn' 
    DECLARE @my_cur CURSOR 
    EXECUTE SP_EXECUTESQL 
     N'SET @my_cur = CURSOR FAST_FORWARD FOR SELECT 
      CASE @field 
       WHEN ''fn'' then fn 
      END 
      FROM dbo.vCard WHERE [fn] LIKE ''%''[email protected]+''%'';OPEN @my_cur;', 
     N'@field sysname, @query NVARCHAR(4000), @my_cur CURSOR OUTPUT', 
     @field = @field, 
     @query = @query, 
     @my_cur = @my_cur OUTPUT 
    FETCH NEXT FROM @my_cur INTO @inputList 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     PRINT @inputList 
     FETCH NEXT FROM @my_cur INTO @inputList 
    END 
    RETURN