可変名の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
明らかにそれはうまくいかないので、どうすれば同様の結果を得ることができますか?
」 クエリ文字列を作成して 不正なクエリを使用して動的SQLを作成していたため、空の文字列が作成されたことがわかりました。 SQL Serverは間違いなく空の文字列を正しく実行しました。EXECUTE
ingしようとしましたが、「コマンドが正常に完了しました」を返すだけで、行セットは返されないようです。
列名を単にハードコーディングするのではなく、これを実行する必要がある理由は、列名がユーザーが構成できるためです。
次のコードを試してください:
_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'
これは、フロントエンドディスプレイソリューションに最適です。クエリ1はデータをプルし、クエリ2は列名をプルバックし、2番目のクエリからのヘッダーの設定を表示するために使用する構造を構築するときにコード内でコードをプルします。
純粋なSQLメソッドは可能かもしれませんが、動的SQLになるため、コードのメンテナンスは悪夢になります。
また、sp_executesql
だけでなくEXECUTE N'Query String'
を探していると、コマンドの問題が正常に完了する可能性があります。