2011-09-20 2 views
0

예를 들어, 저는 varchar 200 열을 가지고 있지만 최대 25 개의 varchar 값을가집니다. 따라서이 쿼리는이 열을 반환해야합니다. 이 쿼리는 선택한 테이블의 모든 열을 통해 실행되어야하며 모든 종류의 결과를 반환해야합니다. 따라서 열 구조를 검토하고 적절한 조치를 취할 수 있습니다.마스터 SQL 쿼리 - 최대 값을 포함하는 것보다 큰 유형을 가진 1 테이블의 모든 열을 찾습니다.

내 말은있다 : "나에게 그들에서 가장 큰 실제 데이터 값보다 더 넓은로 정의 된 모든 열을 찾아"

+1

그는 – Bohemian

+0

감사를 편집 질문에 "나에게 그들에서 가장 큰 실제 데이터 값보다 더 넓은로 정의 된 모든 열을 찾아"의미 : D – MonsterMMORPG

+0

당신이 varchar (8000)에 varchar (10)보다 10 문자를 저장할 때 더 이상 스토리지 비용을 지불하지 않는다는 것을 알고 있습니까? 전 오른쪽 크기의 데이터 유형을 완벽하게 지원합니다. 오해하지 마십시오. – billinkc

답변

1

당신은 내가 할 수와 같은 접근 방식으로 일반적으로했다 무엇 때문에 RDBMS 표시하지 않았다 . INFORMATION_SCHEMA 테이블은 일반적으로 대규모 RDBMS 설치에서 지원됩니다 (이는 모든 것이 가치있는 표준입니다). 그렇지 않다면, 문법의 기이함뿐만 아니라 이용 가능한 메타 데이터에 맞게 조정하십시오. 접근 자체는 건전합니다.

SET NOCOUNT ON; 

-- Create a local table for processing 
DECLARE 
    @RESIZING TABLE 
(
    resizing_id int identity(1,1) NOT NULL PRIMARY KEY 
, schemaname sysname 
, tablename sysname 
, columnname sysname 
, datatype sysname 
, max_length int 
, current_length int 
); 

-- Use the ANSI standard view for system meta data 
-- to populate tables. Only focusing on varchar fields 
-- as they are the only ones that will provide useful 
-- sizing information. 
-- To make it work with chars, update the query individual 
-- queries to perform a trim operation before calling len 
-- and obviously update the data_type to include char 
INSERT INTO 
    @RESIZING 
SELECT 
    ISC.TABLE_SCHEMA 
, ISC.TABLE_NAME 
, ISC.COLUMN_NAME 
, ISC.DATA_TYPE 
, ISC.CHARACTER_MAXIMUM_LENGTH 
, NULL AS current_length 
FROM 
    INFORMATION_SCHEMA.COLUMNS ISC 
WHERE 
    ISC.DATA_TYPE = 'varchar'; 


-- Create a cursor 
-- Kill a kitten 
DECLARE 
    Csr CURSOR 
FOR 
SELECT 
    -- build out a query like 
    -- SELECT @current_len = MAX(LEN(X.[COLUMN_NAME])) FROM [dbo].[TABLE] X WITH(NOLOCK) 
    'SELECT @current_len = MAX(LEN(X.[' 
    + R.columnname 
    + '])) FROM [' 
    + R.schemaname 
    + '].[' 
    + R.tablename 
    + '] X WITH(NOLOCK) ' AS query 
, R.current_length 
FROM 
    @RESIZING R 
FOR UPDATE OF current_length; 

-- 2 local variables, one for the dynamic query 
-- one to hold the results of said query 
DECLARE 
    @query nvarchar(max) 
, @current_length int; 

OPEN 
    Csr; 

FETCH NEXT 
FROM Csr 
INTO @query, @current_length; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    -- try before you buy 
    PRINT @query; 

    -- Run the query, assigning length to @current_length variable 
    EXECUTE sp_executesql @query, N'@current_len int OUTPUT', @current_len = @current_length OUTPUT; 

    -- Push results int our temporary table 
    UPDATE 
     R 
    SET 
     current_length = @current_length 
    FROM 
     @RESIZING R 
    WHERE 
     CURRENT OF Csr; 

    FETCH NEXT 
    FROM Csr 
    INTO @query, @current_length; 
END 

CLOSE Csr; 
DEALLOCATE Csr; 


-- Result the resultset for all the 
-- tables with longer lengths than used 
-- (NULLS included) 
SELECT 
    * 
FROM 
    @RESIZING R 
WHERE 
    R.max_length > isnull(@current_length, 0) 

결과 (SQL 서버 2008 R2는)

resizing_id | schemaname | tablename | columnname | datatype | max_length | current_length 
1   | dbo  | DupesOk  | name  | varchar | 50   | 12 
2   | dbo  | SALES_HEADER | CCCode  | varchar | 15   | 15 
3   | lick  | ABC   | value  | varchar | 50   | 8 
+0

이것은 int 또는 tiny int가 아닌 char 열만 표시합니까? – MonsterMMORPG

+1

현재 귀하의 질문에 따라 varchar에 대해서만 설정되어 있습니다. ;) 정수형을 처리하는 논리는 그다지 어렵지 않습니다. 10 진수 타입은 많은 것들이 더 어둡습니다. – billinkc

+0

숫자를 표시하기 위해 수정할 수 있습니까? D 감사합니다. – MonsterMMORPG

관련 문제