【发布时间】:2014-05-12 13:45:03
【问题描述】:
我需要遍历我的 sql server 数据库中的所有表,对于每个表,我需要返回所有行的值,但棘手的是我需要将列名元数据与该列的值并排返回.
例如,
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
但我需要为每一行数据返回一行列元数据 + 列值。有没有人有任何见解?我还在四处闲逛。谢谢!
编辑: 我终于让脚本工作了
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
【问题讨论】:
-
你用什么语言编程?你希望你的输出去哪里?到文件?到屏幕上?
-
也许如果你说你在用数据做什么,我们可以提供更好的建议。
-
T-SQL。我希望输出转到全局临时表。谢谢!
-
@cometbill,我需要这个输出,因为我将遍历这个输出并使用列名和值构造 CASE WHEN 语句。谢谢
标签: sql-server