2017-10-30 11 views
0

아래 코드는 내 코드이지만 현재 궁극적 인 목표는 데이터베이스의 모든 텍스트와 유사한 필드를 확인하고 특정 조건 및 필요한 경우 수정.SQL Server (Transact)의 외부 커서에서 변수에 액세스하는 데 어려움이 있음

저는이쪽으로 나아갔습니다. 실제로 열의 값을 검색하려고 시도 할 때까지 모든 것이 괜찮 았습니다.

set @CurrentValue 할 때 문제가 발생합니다. top 1 코드는 나중에 코드를 확장 할 때까지 일시적이지만 문제는 아닙니다. 이 테스트에서 나는 @TableName을 내부 루프 while 루프에서 만들 때 오류가 있다는 것을 발견했습니다.

Must declare the table variable "@TableName". 

저는 절차 적 Transact SQL의 전문가는 아닙니다. 이 위치에서이 변수에 액세스 할 수있는 방법이 있습니까?

--Edit following config lines as necessary 
USE mytable 
DECLARE @SchemaName SYSNAME = 'dbo' 
DECLARE @TableName SYSNAME 

DECLARE TableCursor CURSOR FOR 
SELECT t.name 
    FROM sys.tables AS t 
    INNER JOIN sys.schemas AS s 
    ON t.[schema_id] = s.[schema_id] 
    WHERE s.name = @SchemaName 
    and lower(t.name) like 'online%'; 

OPEN TableCursor 

FETCH NEXT FROM TableCursor 
INTO @TableName 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     PRINT '-----' 
     PRINT @TableName 
     PRINT '-----' 

     DECLARE MatchingColumns CURSOR LOCAL FOR 
     SELECT COLUMN_NAME 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE 
     TABLE_NAME = @TableName 
     AND 
     DATA_TYPE in ('nvarchar', 'varchar', 'ntext', 'text', 'nchar', 'char'); 

     DECLARE @ColumnName NVARCHAR(MAX) 

     OPEN MatchingColumns 

     FETCH NEXT FROM MatchingColumns 
     INTO @ColumnName 

     WHILE @@FETCH_STATUS = 0 
     BEGIN 

      DECLARE @CurrentValue NVARCHAR(MAX) 

      set @CurrentValue = (
       select top 1 @ColumnName 
       from @TableName 
      ) 


      PRINT @ColumnName 

      FETCH NEXT FROM MatchingColumns 
      INTO @ColumnName 

     END 

     CLOSE MatchingColumns 
     DEALLOCATE MatchingColumns 

     FETCH NEXT FROM TableCursor 
     INTO @TableName 


    END 

CLOSE TableCursor 
DEALLOCATE TableCursor 
+0

의 가능한 복제 https://stackoverflow.com/questions/2838490/table-name-as- ON

set @CurrentValue = ( select top 1 @ColumnName from @TableName ) 

바꾸기 변수) - 실제로 플래그가 너무 늦었습니다.하지만 인용문에 대해 경고하기 때문에이 태그가 더 마음에 들었습니다. [변수가있는 선택 쿼리에서 SQL Server 테이블 이름을 사용하려면 어떻게합니까?] (https://stackoverflow.com/questions/10521144/how-do-i-use-sql-server-table-in-select-que ry-with-a-variable) –

답변

0

declare @cmd nvarchar(200) 
set @cmd = N'SELECT TOP 1 @CurrentValue=' + @ColumnName + ' from ' + @TableName 
EXECUTE @CurrentValue = sp_executesql @cmd, N'@CurrentValue VARCHAR(MAX)', @CurrentValue OUT 
[표 변수 이름 (
+0

대답은 변화하는 것을 변화시키는 이유를 설명해야합니다. –

+0

나는이 작업을 시도하고 숫자를 반환했다. 내가 디버깅 할 때 올바른 SQL SELECT TOP 1 MyColumn from MyTable varchar가 생성되었고 아무것도 충돌하지 않지만 'CurrentValue'는 텍스트 값 대신'214 '값을가집니다. –

+0

예, 수정 된 검색어 –