Некоторые общие замечания:
- При динамическом присвоении имен столбцам набора результатов в любом случае потребуется динамический SQL. Не обойтись ...
- Имена столбцов для переноса дополнительной информации - в большинстве случаев - очень плохая идея.
- единственный известный мне способ справиться с звездочкой в
SELECT * FROM ...
и получить полный контроль над именами и типами столбцов - это XML.
Попробуйте это:
SELECT TOP 10 *
FROM sys.objects
FOR XML RAW, ROOT('TableDef'),ELEMENTS, XMLSCHEMA,TYPE
Это вернет 10 первых строк sys.objects
. Результатом является XML, где строки соответствуют определению схемы XML.
Возможно (но, безусловно, не самое лучшее по производительности) динамическое создание полностью встроенного запроса. Результатом будет список EAV , содержащий все необходимое.
WITH PrepareForXml(QueryAsXml) AS
(
SELECT
(
SELECT TOP 10 *
FROM sys.objects
FOR XML RAW, ROOT('TableDef'),ELEMENTS, XMLSCHEMA,TYPE
)
)
,AllRows AS
(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) RowIndex
,rw.query('.') theRowXml
FROM PrepareForXml
CROSS APPLY QueryAsXml.nodes('TableDef/*:row') A(rw)
)
SELECT RowIndex
,B.ColumnName
,B.ColumnValue
,COALESCE(
(SELECT QueryAsXml.value('declare namespace xsd="http://www.w3.org/2001/XMLSchema";
(TableDef
/xsd:schema
/xsd:element
/xsd:complexType
/xsd:sequence
/xsd:element[@name=sql:column("ColumnName")]
/@type )[1]','nvarchar(max)')
FROM PrepareForXml)
,(SELECT QueryAsXml.value('declare namespace xsd="http://www.w3.org/2001/XMLSchema";
(TableDef
/xsd:schema
/xsd:element
/xsd:complexType
/xsd:sequence
/xsd:element[@name=sql:column("ColumnName")]
/xsd:simpleType
/xsd:restriction
/@base)[1]','nvarchar(max)')
FROM PrepareForXml)
) AS ColumnType
FROM AllRows
CROSS APPLY theRowXml.nodes('*:row/*') A(col)
CROSS APPLY (SELECT col.value('local-name(.)','nvarchar(max)') ColumnName
,col.value('(./text())[1]','nvarchar(max)') ColumnValue ) B;
Это начало набора результатов:
RowIndex ColumnName ColumnValue ColumnType
1 name sysrscols sqltypes:nvarchar
1 object_id 3 sqltypes:int
1 schema_id 4 sqltypes:int
[...many more...]
Я не знаю, что вам на самом деле нужно, но этого может быть достаточно для экспорта XML , как есть . Там все есть ...
ОБНОВЛЕНИЕ: я не читал достаточно внимательно ...
Вы хотите заметить тот факт, что имена столбцов результирующего набора должны быть уникальными, чтобы продолжить это ...
Подход выше не решит эту проблему. К сожалению.
Я не буду удалять это немедленно ... Возможно, есть некоторые подсказки, которые вы можете извлечь из этого ...