Sql server 如何循环SQL server数据库中所有表中的所有列,并返回与列值并列的列名?
我需要遍历sql server数据库中的所有表,对于每个表,我需要为所有行返回值,但棘手的是,我需要将列名元数据与该列的值并排返回 比如说,Sql server 如何循环SQL server数据库中所有表中的所有列,并返回与列值并列的列名?,sql-server,Sql Server,我需要遍历sql server数据库中的所有表,对于每个表,我需要为所有行返回值,但棘手的是,我需要将列名元数据与该列的值并排返回 比如说, column1 collumn2 column3 A B C AA BB CC 对于这张桌子,我需要返回 column1 A collumn2 B column3 C column1 AA collumn2 BB column3 抄送 我有一个脚本,它使用游标在所有表中循环,并在每个表中返回所有列的
column1 collumn2 column3
A B C
AA BB CC
对于这张桌子,我需要返回
column1 A collumn2 B column3 C
column1 AA collumn2 BB column3
抄送
我有一个脚本,它使用游标在所有表中循环,并在每个表中返回所有列的名称,但不返回值
我还让脚本一个接一个地返回列名和值,如下所示
column1 A
column1 AA
column2 B
column2 BB
column3 C
column3 CC
但我需要为每行数据返回一行列metadat+列vaue。有人有什么见解吗?我还在四处闲逛。谢谢
编辑:
我终于让剧本开始工作了
drop table #results
CREATE TABLE #Results (TypeColumnName nvarchar(100), TypeColumnValue int, CodeValueName nvarchar(100), CodeValueValue nvarchar(100), DescriptionName nvarchar(100), DescriptionValue nvarchar(1024) )
SET NOCOUNT ON
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @sql nvarchar(max), @sql0 nvarchar(max)
SET @TableName = ''
WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
set @sql=''
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
and table_schema = 'test'
and table_name like 'sales%'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
)
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)
IF @ColumnName IS NOT NULL
BEGIN
--select @columnname
set @sql = @sql + '''' + @TableName + '.' + @ColumnName + ''',' + @ColumnName + ', '
END
ELSE
begin
SET @sql = left(rtrim(@sql),Len(rtrim(@sql))-1)
set @sql = 'SELECT ' + @sql + ' FROM ' + @TableName + ' (NOLOCK) '
select @sql
INSERT INTO #Results
EXEC sp_executesql @sql
end
END
end
这能让你开始吗
select t.name, c.name, c.system_type_id , c.max_length
,Case c.system_type_id
when 167 then 'VarChar'
When 231 then 'nVarChar'
when 4 then 'Integer'
when 56 then 'int'
when 61 then 'DateTime'
else 'Unknown'
End
from sys.tables t
inner join sys.columns c
on c.object_id = t.object_id
order by t.name, c.column_ID
我设计的这个T-SQL在SQLServer2008R2中工作
您可以使用sp_help找出其他“未知”列类型,并自己将其添加到case语句中。使用UNPIVOT功能: 选择col1,colval 从…起 选择col1、col2、col3 来自表1 UNPIVOT col2、col3中colname的colval 作为unpiv 您可以在不同的位置添加联接和where子句,以便根据需要进行筛选。在我的一个应用程序中,我在第一个查询中进行了筛选和联接,然后将最终结果联接到多个表中,等等
您还可以以非常类似的方式使用PIVOT功能进行反向操作。这两个功能请在线阅读相关书籍。。。我想他们会帮你解决问题的 你用什么语言编程?您希望输出到哪里?归档?到屏幕上?也许如果你说你正在对数据做什么,我们可以建议更好。T-SQL。我希望输出转到全局临时表。谢谢大家!@cometbill,我需要这个输出,因为我将在这个输出中循环并使用列名和值构造CASE WHEN语句。非常感谢@cometbill,不幸的是,这只提供了元数据,而我需要查看列名之外的列的实际值,以便构造case语句。这主要用于查找表,例如,它有代码列和描述列,因此我可以在[code column name]=“code value”然后[description column name]=“description value”@Wendy需要元数据和数据时构建case语句作为case?一旦字段中包含一些数据,就可以确定字段类型。我不知道为什么只有当代码值是某个代码时才要设置description值。约翰,我忘记了UNPIVOT函数——我只是尝试了一下,但它仍然不能解决我的问题,因为我还需要输入列名。但手边有这个很好。多谢!当我运行它时,我会得到列名和相应的值。所以基本上它把我的宽桌子变成了一张高桌子。我想如果你继续尝试,它会满足你的需要。