Большой запрос на соединение SQL Server с дублирующимися столбцами не может быть экспортирован - PullRequest
0 голосов
/ 27 июня 2018

Я имею дело с большим запросом SQL, включающим много объединений (использующих T-SQL) с таблицами, столбцы которых больше не являются уникальными для этого объединения. Результат имеет> 600 столбцов. Есть ли способ поставить префикс столбцов результата с именем таблицы без явного вызова каждого столбца в выбранной части запроса, чтобы я мог экспортировать его в CSV с уникальными именами столбцов?

Например, у нас есть 28 таблиц, некоторые из которых имеют общее имя столбца. Я не могу экспортировать это в csv, потому что он не может узнать разницу между столбцами с похожими именами.

       TABLE 1
| columnA | columnB |

       TABLE 2
| columnC | columnB |

результат выглядит так:

| columnA | columnB | columnC | columnB |

Я не могу экспортировать набор результатов, потому что columnB используется дважды в качестве имени столбца.

Мне бы хотелось, чтобы набор результатов показывал:

| TABLE1.columnA | TABLE1.columnB | TABLE2.columnC | TABLE2.columnB |

1 Ответ

0 голосов
/ 27 июня 2018

Единственный способ, которым вы действительно можете это сделать, - использовать Dynamic SQL или ввести их все. Поскольку вы не хотите делать последнее, это оставляет вас с первым. Обратите внимание, что ниже приведен пример, вам нужно изменить нижеприведенное для ваших собственных нужд, однако это должно привести вас на правильный путь.

USE Sandbox;
GO

CREATE TABLE Customer (ID int IDENTITY(1,1),
                       [Name] varchar(50));
CREATE TABLE Item (ID int IDENTITY(1,1),
                   [Name] varchar(50));
CREATE TABLE CustomerOrder (ID int IDENTITY(1,1),
                            ItemID int,
                            CustomerID int);
GO
INSERT INTO Customer ([Name])
VALUES ('Joe Bloggs'),('Jayne Smith');
INSERT INTO Item ([Name])
VALUES ('Spanner'),('Saw'),('Screwdriver');
INSERT INTO CustomerOrder (ItemID, CustomerID)
VALUES (1,1),(3,1),(3,1),(2,2),(3,2);
GO
SELECT *
FROM Customer C
     JOIN CustomerOrder CO ON C.ID = CO.CustomerID
     JOIN Item I ON CO.ItemID = I.ID;
GO
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT ' +
           STUFF((SELECT N',' + NCHAR(10) + N'       ' + QUOTENAME(t.[name]) + N'.' + QUOTENAME(c.[name]) + N' AS ' + QUOTENAME(t.[name] + N'.' + c.[name])
                  FROM sys.columns c
                       JOIN sys.tables t ON c.object_id = t.object_id
                  WHERE t.[name] IN (N'Customer',N'Item',N'CustomerOrder')
                  FOR XML PATH(N'')),1,9,N'') + NCHAR(10) +
           N'FROM Customer' + NCHAR(10) +
           N'     JOIN CustomerOrder ON Customer.ID = CustomerOrder.CustomerID' + NCHAR(10) +
           N'     JOIN Item ON CustomerOrder.ItemID = Item.ID;';

PRINT @SQL; --Your best friend
--SELECT @SQL; --your other best friend, as I'd guess @SQL is actually going to have more than 4000 characters and PRINT can't handle that

EXEC sp_executesql @SQL;

GO
DROP TABLE Customer;
DROP TABLE Item;
DROP TABLE CustomerOrder;
GO
...