2010-12-03 3 views
2

SQL Server 2005를 사용 중이고 sa으로 로그인했습니다. 내 데이터베이스의 모든 테이블에 특정 열 이름이 있는지 여부를 쿼리하고 싶습니다. 그리고 각 열 (columnNameValue = someValue)을 결과 테이블에 추가하십시오. 그런 다음 결과 테이블을 반환하십시오.데이터베이스의 모든 테이블에서 모든 행 선택 (열 이름 = 값) 열 이름이있는 경우

거기에는 몇 가지 유사한 문제가 있습니다. 특히 나는 이것을 위해 sp_MSForeachTable을 사용할 수 있지만 어떤 종류의 문서도 부족합니다. SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES을 사용하면 모든 테이블의 목록을 얻을 수 있습니다.

다음 솔루션 (link text)은 모든 열 & 모든 테이블로 이동하여 셀에서 특정 값을 찾습니다. 해당 열이 특정 columnName 인 경우 셀에서 특정 값을 찾는 것과 다릅니다.

중첩 된 while 문을 작성할 수는 있지만 이와 같은 쿼리를 실행하는 모든 inbuilt 명령이 있습니까?

의사 코드가 도움이된다면 :

foreach(table in tableList) { 
    if (table.hasColumnName(SOME_COLUMN) { 
     EXEC ('SELECT * FROM table WHERE (SOME_COLUMN = SOME_VALUE)') 
    } 
} 

[편집]

오히려 그 하나의 결과는 내가 적어도 선택 반환만큼 테이블 당 하나의 결과 싶습니다 설정 한

하나의 행. 조인이나 노조가 작동하는 것을 기대하는 것이 비현실적이므로 매우 많은 양의 결과가 있어야합니다.

가능하면 각 결과의 시작에 tablename을 추가하고 싶습니다.

은 그 아래의 간단한 쿼리는 모든 결과를 얻을 수 있지만 그것은에 어떤 테이블이 속한 개인에 따라 결과의 시각적 표시를 제공 빈 테이블을 표시하고 나던 뜻 :

[또한 편집]

확인 IF를 포함 아래의 쿼리를 존재 업데이트 그 @Martin하는 결과 덕분에 테이블 소스를 추가 할 소스 컬럼으로 NULL 결과 & 선택 이름을 제거

DECLARE @COLUMN_VALUE nvarchar(512), @VALUE nvarchar(10); 

SET @COLUMN_VALUE = 'id' 
SET @VALUE = '0'; 

DECLARE @TABLE_NAME nvarchar(512), @COLUMN_NAME nvarchar(512), @QUERY nvarchar(512); 

SET @TABLE_NAME = ''; 

WHILE @TABLE_NAME IS NOT NULL 
BEGIN 
    SET @TABLE_NAME = 
    (
     SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
     FROM INFORMATION_SCHEMA.TABLES 
     WHERE QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TABLE_NAME 
    ); 
    PRINT 'Table name : ' + @TABLE_NAME; 
    SET @COLUMN_NAME = 
    (
     SELECT MIN(QUOTENAME(COLUMN_NAME)) 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE (TABLE_NAME = PARSENAME(@TABLE_NAME, 1)) 
      AND (COLUMN_NAME = @COLUMN_VALUE) 

    ); 
    PRINT 'Column name : ' + @COLUMN_NAME; 
    IF @COLUMN_NAME IS NOT NULL 
    BEGIN 
     SET @QUERY = 
      'SELECT ''' + @TABLE_NAME + ''' AS Source, * ' + 
      'FROM ' + @TABLE_NAME + ' ' + 
      'WHERE (' + @COLUMN_NAME + ' = ' + @VALUE + ')' 
     EXEC 
     (
      'IF EXISTS(' + @QUERY + ') ' + @QUERY 
     ) 
    END  
END 
+0

TableA에 두 개의 열이 있고 TableB에 세 개의 열이 있으면 어떻게 될 것으로 예상됩니까? –

+0

@Lieven 모든 결과를 하나의 테이블에 병합 할 필요가 없으므로 columnName이 유효한 각 테이블에 대해 단일 결과 세트를 반환합니다. – Raynos

답변

7
CREATE TABLE foo 
(
SOME_COLUMN VARCHAR(10) 
) 

CREATE TABLE bar 
(
SOME_COLUMN VARCHAR(10) 
) 

INSERT INTO bar VALUES ('SOME_VALUE') 


DECLARE @Query nvarchar(max) 

SELECT 
     @Query = isnull(@Query + ';','') + 
     'IF EXISTS(SELECT * FROM ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + 
     QUOTENAME(o.name) + ' WHERE SOME_COLUMN=''SOME_VALUE'') 
     SELECT ''' + o.name +''' AS Source, * FROM ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + 
     QUOTENAME(o.name) + ' WHERE SOME_COLUMN=''SOME_VALUE''' 
FROM sys.columns c 
JOIN sys.objects o 
ON o.object_id = c.object_id 
WHERE o.type IN ('U','V') AND c.name = 'SOME_COLUMN' 

EXEC sp_executesql @Query 
+0

'schema_id'와'object_id'가 무엇이되어야하는지 명확히 할 수 있습니까? 나는 열을 많이 가진 큰 JOIN으로 설정된 th 결과를 요구하는 것이 쓸데 없다는 것을 깨달았다. – Raynos

+0

무슨 뜻인지 확실치 않습니다. 이것들은'sys.tables'의 열입니다. –

+0

그것은 http://www.sql-server-performance.com/faq/all_queries_must_have_an_equal_number_of_expressions_p1.aspx 오류를 발생시킵니다. 나는 모든 테이블이 칼럼 이름을 그들에게 말했던 garantuee가 없다고 언급하는 것을 잊는다. – Raynos