키워드 - sql//




SQL Server보기-잘못된 명명 규칙? (2)

DECLARE @TableName AS VARCHAR(250);
DECLARE @SQL AS VARCHAR(500);
DECLARE @ViewCheck as CURSOR;

SET @ViewCheck = CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'VIEW' AND TABLE_NAME LIKE 'V_WFC%'

OPEN @ViewCheck

FETCH NEXT FROM @ViewCheck INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN

Set @SQL = 'SELECT TOP 10 * FROM ' + @TableName 

PRINT(@SQL)
EXEC(@SQL)

FETCH NEXT FROM @ViewCheck INTO @TableName;
END

CLOSE @ViewCheck

특정 스키마의 모든 SQL 뷰를 통해 커서가 정상적으로 작동하는지 확인하고 일부는보고에 연결되며 일부는 ProSolution에서 응용 프로그램 데이터 원본으로 사용됩니다.

이러한보기 중 하나는 UnmarkedRegister (오늘) 라고 이름 지어 지며 , 대괄호는 유사한보기와 구분하기 위해 사용됩니다.이 것은 응용 프로그램 내에서 표시 데이터를 구동하는 데 사용됩니다.

쿼리가 예상대로 실행되는 동안 올바른 데이터를 반환하면 커서가 오류를 반환합니다.

메시지 208, 수준 16, 상태 1, 줄 1
잘못된 개체 이름 'V_WFC_UnmarkedRegister'

커서의 EXEC (SQL) 섹션에서 괄호로 묶은 섹션이 생략 된 이유는 무엇입니까?


괄호는 일반적으로 함수 호출을 식별하기 때문에

이 줄 바꾸기 :

Set @SQL = 'SELECT TOP 10 * FROM ' + @TableName

이를 수정해야합니다.

Set @SQL = 'SELECT TOP 10 * FROM [' + @TableName + ']'

나는 진실로 커서를 싫어하며 여기에 커서가 전혀 필요 없다. 몇 가지 방법으로이 코드를 크게 단순화 할 수 있습니다. 먼저 INFORMATION_SCHEMA 뷰 대신 sys.views를 사용하고 있습니다. 그리고 나서 커서 대신 동적 SQL 문자열을 생성하기 위해 sql을 사용하고 있습니다. 이것이 얼마나 간단한 지보십시오.

declare @SQL nvarchar(max) = '';

select @SQL = @SQL + 'select top 10 * from ' + QUOTENAME(v.name) + '; select ''('' + convert(varchar(2), @@ROWCOUNT) + '' rows affected'';'
from sys.views v
where v.name LIKE 'V_WFC%'

print @SQL
exec sp_executesql @SQL




sql-server