열의 별칭을 동적으로 지정하려면 어떻게합니까?


10

가변적으로 명명 된 20 개의 열이있는 테이블 (나에 의해 설계되지 않은)이 있습니다. 즉,보고있는 레코드 유형에 따라 해당 열 이름이 변경 될 수 있습니다.

가능한 열 이름은 다른 테이블에 저장되므로 매우 쉽게 쿼리 할 수 ​​있습니다.

따라서 실제로 찾고있는 쿼리는 다음과 같습니다.

SELECT Col1 AS (SELECT ColName FROM Names WHERE ColNum = 1 and Type = @Type),
       Col2 AS (SELECT ColName FROM Names WHERE ColNum = 2 and Type = @Type)
FROM   Tbl1 
WHERE  Type = @Type

분명히 작동하지 않으므로 어떻게 비슷한 결과를 얻을 수 있습니까?

' 쿼리 문자열을 작성하고 시도했지만 EXECUTE"Command (s) Completed Successfully"를 반환하고 행 집합을 반환하지 않는 것 같습니다. 동적 SQL을 작성하기 위해 잘못된 쿼리를 사용하고 빈 문자열을 작성했습니다. SQL Server는 빈 문자열을 올바르게 실행했습니다.

단순히 열 이름을 하드 코딩하는 대신이 작업이 필요한 이유는 열 이름을 사용자가 구성 할 수 있기 때문입니다.


1
쿼리 문자열을 인쇄하고 새 쿼리 창에 복사 / 붙여 넣기하여 실행하면 어떻게됩니까?
DenisT

"사용자 구성 가능"은 수백 또는 수천 개의 유형 및 / 또는 별칭이 자주 변경됨을 의미합니까? 별칭이 상당히 안정적인 경우 일련의보기를 만드는 것이 좋습니다.
모든 거래의 존

@DenisT, 그것은 아무것도 출력하지 않습니다. 아마도 다른 것이 잘못되었음을 나타냅니다. 리드 주셔서 감사합니다.
핫칩

@JonofAllTrades 불행히도, 그것들은 상당히 안정적이지만, 사용자가 소프트웨어에서 무언가를 변경할 때, 그 또한 보고서에서 바뀌어야한다는 사양의 많은 부분입니다.
핫칩

@DenisT 동적 SQL을 빌드하는 데 사용 된 서브 쿼리가 올바르지 않으며 널 세트를 리턴했습니다. 따라서 SQL Server는 빈 쿼리를 반환하여 성공적으로 실행되었습니다. PRINT 명령을 지적 해 주셔서 감사합니다.
핫칩

답변:


12

다음 코드를 시도하십시오.

CREATE TABLE #Names
(
    [Type] VARCHAR(50),
    ColNum SMALLINT,
    ColName VARCHAR(50),
    ColDataType VARCHAR(20)
)

INSERT  INTO #Names VALUES
('Customer', 1, 'CustomerID', 'INT'),
('Customer', 2, 'CustomerName', 'VARCHAR(50)'),
('Customer', 3, 'CustomerJoinDate', 'DATE'),
('Customer', 4, 'CustomerBirthDate', 'DATE'),
('Account', 1, 'AccountID', 'INT'),
('Account', 2, 'AccountName', 'VARCHAR(50)'),
('Account', 3, 'AccountOpenDate', 'DATE'),
('CustomerAccount', 1, 'CustomerID', 'INT'),
('CustomerAccount', 2, 'AccountID', 'INT'),
('CustomerAccount', 3, 'RelationshipSequence', 'TINYINT')


CREATE TABLE #Data
(
    [Type] VARCHAR(50),
    Col1 VARCHAR(50),
    Col2 VARCHAR(50),
    Col3 VARCHAR(50),
    Col4 VARCHAR(50),
    Col5 VARCHAR(50),
    Col6 VARCHAR(50),
    Col7 VARCHAR(50)
)

INSERT  INTO #Data VALUES
('Customer', '1', 'Mr John Smith', '2005-05-20', '1980-11-15', NULL, NULL, NULL),
('Customer', '2', 'Mrs Hayley Jones', '2009-10-10', '1973-04-03', NULL, NULL, NULL),
('Customer', '3', 'ACME Manufacturing Ltd', '2012-12-01', NULL, NULL, NULL, NULL),
('Customer', '4', 'Mr Michael Crocker', '2014-01-13', '1957-01-23', NULL, NULL, NULL),
('Account', '1', 'Smith-Jones Cheque Acct', '2005-05-25', NULL, NULL, NULL, NULL),
('Account', '2', 'ACME Business Acct', '2012-12-01', NULL, NULL, NULL, NULL),
('Account', '3', 'ACME Social Club', '2013-02-10', NULL, NULL, NULL, NULL),
('Account', '4', 'Crocker Tipping Fund', '2014-01-14', NULL, NULL, NULL, NULL),
('CustomerAccount', '1', '1', '1', NULL, NULL, NULL, NULL),
('CustomerAccount', '2', '1', '2', NULL, NULL, NULL, NULL),
('CustomerAccount', '2', '3', '2', NULL, NULL, NULL, NULL),
('CustomerAccount', '3', '2', '1', NULL, NULL, NULL, NULL),
('CustomerAccount', '3', '3', '1', NULL, NULL, NULL, NULL),
('CustomerAccount', '4', '2', '2', NULL, NULL, NULL, NULL),
('CustomerAccount', '4', '4', '1', NULL, NULL, NULL, NULL)


DECLARE @Type VARCHAR(50) = 'Account' -- Or Customer, or CustomerAccount

DECLARE @SQLText NVARCHAR(MAX) = ''

SELECT  @SQLText += 'SELECT '

SELECT  @SQLText += ( -- Add in column list, with dynamic column names.
                SELECT  'CONVERT(' + ColDataType + ', Col' + CONVERT(VARCHAR, ColNum) + ') AS [' + ColName + '],'
                FROM    #Names
                WHERE   [Type] = @Type FOR XML PATH('')
            )

SELECT  @SQLText = LEFT(@SQLText, LEN(@SQLText) - 1) + ' ' -- Remove trailing comma

SELECT  @SQLText += 'FROM #Data WHERE [Type] = ''' + @Type + ''''

PRINT   @SQLText
EXEC    sp_executesql @SQLText

SELECT 문을 리턴합니다. SELECT CONVERT(INT, Col1) AS [AccountID],CONVERT(VARCHAR(50), Col2) AS [AccountName],CONVERT(DATE, Col3) AS [AccountOpenDate] FROM #Data WHERE [Type] = 'Account'


질문이 SQL로 수행하는 방법을 물었을 때 동적 SQL을 사용하는 것이 정답입니다. 또한 내가 시도한 것이었지만 잘못되었습니다.
핫칩

곰은, 사용자 입력을 받아들이고 동적 SQL을 구축하는 데 사용하는 경우 다음 당신은 정말 마음에 정말 SQL 주입 및 살균 입력에 대해 우려 할 필요가있다. bobby-tables.com
Jonathan Van Matre

@JonathanVanMatre 절대적으로. 다행히도 이것은 내부 용도로만 사용 되며 모든 입력은 이미 앱에서 삭제되었습니다.
핫칩

7

프런트 엔드 디스플레이 솔루션에 가장 적합합니다. 쿼리 1은 데이터를 가져오고 쿼리 2는 열 이름과 코드를 가져 와서 두 번째 쿼리에서 헤더를 설정하는 데 사용하는 구조를 작성할 때 코드에서 가져옵니다.

순수한 SQL 방법이 가능할 수도 있지만 동적 SQL이 될 것이며 코드 유지 관리는 악몽이 될 것입니다.

또한 당신은 아마 찾고 sp_executesql뿐 아니라 EXECUTE N'Query String'그 해결할 수 있으므로 명령의 문제가 성공적으로 완료되었습니다.


동의합니다. SSRS에서이 작업을 확실히 수행 할 수 있지만 현재 사용중인 다른보고 소프트웨어에서는이 작업을 수행 할 수 없습니다.
핫칩
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.