[英]Unable to add a new column to SQL Server table with TIMESTAMP data type
[英]SQL Server : add 'Type' to every column in table
我在SQL Server中有一张表DemoTable
。 它具有以下列:
Column1, Column2, Column3
我想查询表格
select * from DemoTable
但在查询结果我想连接Type_
所有可用的列名DemoTable
。
因此,此查询的结果应显示列
Type_Column1, Type_Column2, Type_Column3
有什么功能或任何方法可以实现这一目标吗?
注意:只有N个列,而不仅仅是3个,仅用于手动重命名。
如果问题是您所说的:
连接所有表后,有很多重复的列名
那么典型的解决方案是不使用*
。 所以代替这个:
SELECT *
FROM A
JOIN B ON ...
JOIN C ON ...
...您应该考虑使用自定义列集,这是正常且推荐的方法,如以下示例所示:
SELECT A.Column1, A.Column2, B.Column3, C.Column4, C.Column5
FROM A
JOIN B ON ...
JOIN C ON ...
这是一种使用动态SQL自动执行任务的方法:
use MY_DATABASE;
go
--here you specify all your parameters, names should be self-explanatory
declare @sql varchar(1000) = 'select ',
@tableName varchar(100) = 'DemoTable',
@prefix varchar(10) = 'Type_';
select @sql = @sql + name + ' as ' + @prefix + name + ',' from sys.columns
where object_name(object_id) = @tableName;
set @sql = left(@sql, len(@sql) - 1) + ' from ' + @tableName;
exec(@sql);
一些一般性的评论:
SELECT * FROM ...
处理星号并且仍然能够完全控制列名和类型的唯一方法是XML。 尝试这个:
SELECT TOP 10 *
FROM sys.objects
FOR XML RAW, ROOT('TableDef'),ELEMENTS, XMLSCHEMA,TYPE
这将返回sys.objects
的前10行。 结果是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可能就足够了。 一切都在那里...
您想弄清楚一个事实,即结果集的列名必须唯一,才能继续执行此操作...
上面的方法不能解决此问题。 抱歉。
我不会立即删除它...可能会有一些提示可以让您摆脱此...
您可以使用以下查询将“类型”添加到表中的每一列:
SELECT Column1 AS Type_Column1, Column2 AS Type_Column2, Column3 AS Type_Column3
FROM DemoTable
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.