我需要遍历我的sql server数据库中的所有表,并且对于每个表,我需要返回所有行的值,但是棘手的是我需要将列名元数据与该列的值并排返回。
例如,
column1 collumn2 column3
A B C
AA BB CC
对于这个表,我需要返回
column1 A collumn2 B column3 C
column1 AA collumn2 BB column3
CC
我有脚本使用游标循环遍历所有表并在每个表中,返回所有列'名字(但不是价值)。
我还有脚本逐个返回列名和值,如
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
答案 0 :(得分:1)
这会让你入门吗?
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在SQL Server 2008 R2中运行
您可以使用sp_help找出其他未知的'列类型并自己在case语句中添加它们。
答案 1 :(得分:0)
使用UNPIVOT功能:
SELECT col1, colval
FROM (
SELECT col1, col2, col3
FROM table1
) UNPIVOT (
colval for colname IN (col2, col3)
) as unpiv
您可以根据需要在不同位置添加联接和where子句。在我的一个应用程序中,我在第一个查询中过滤并加入,然后将最终结果加入到更多表格等...
您也可以以非常类似的方式执行与PIVOT功能相反的操作。查看联机丛书中的这两项功能......我认为他们会为您解决问题。