我想创建一个SQL语句,它将返回数据库中代码字段的不同值,以及代码列的名称和列所在表的名称。
我有这样的事情:
select c.name as 'Col Name', t.name as "Table Name'
from sys.columns c, sys tables t
where c.object_id = t.object_id
and c.name like 'CD_%'
它会生成我想要的列和表列表,但显然不会返回列表中每个代码的任何值。
我的数据库中有超过100个表。我可以使用上面的结果集并为每个结果写一个查询:
Select distinct CD_RACE from PERSON
它将返回值,但它不会返回列和表名,而且我必须单独执行每一个。有什么办法可以在我的数据库中获取EACH代码的值,列名和表名吗?
有什么想法吗?感谢...
答案 0 :(得分:0)
只需生成您的选择并将列和表名称作为静态值引入。这是Oracle版本:
选择'选择不同的'' || c.column_name ||'''' as" Col Name",''' || t.table_name ||''' as"表名",' || c.column_name ||'来自' || t.table_name ||';' 来自all_tab_columns c,all_tables t 其中c.table_name = t.table_name;
这将为您提供一堆单独的语句,您可以稍微修改查询以在每个选择之间放置一个联合,如果您真的想要执行一个超级查询以便一次获取所有代码值。
答案 1 :(得分:0)
这是SQL Server的一种方法,因为其他人覆盖了Oracle(以及未提及的特定DBMS。以下步骤已完成:
以下是示例:
-- Store the values and source of the values
DECLARE @Values TABLE (
SchemaName VARCHAR(500),
TableName VARCHAR(500),
ColumnName VARCHAR(500),
ColumnValue VARCHAR(MAX)
)
-- Build list of SQL Commands to run
DECLARE @Commands TABLE (
Id INT PRIMARY KEY NOT NULL IDENTITY(1,1),
SchemaName VARCHAR(500),
TableName VARCHAR(500),
ColumnName VARCHAR(500),
SqlCommand VARCHAR(1000)
)
INSERT @Commands
SELECT
[TABLE_SCHEMA],
[TABLE_NAME],
[COLUMN_NAME],
'SELECT DISTINCT '
+ '''' + [TABLE_SCHEMA] + ''', '
+ '''' + [TABLE_NAME] + ''', '
+ '''' + [COLUMN_NAME] + ''', '
+ '[' + [COLUMN_NAME] + '] '
+ 'FROM [' + [TABLE_SCHEMA] + '].[' + [TABLE_NAME] + ']'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE 'CD_%'
-- Loop through commands
DECLARE
@Sql VARCHAR(1000),
@Id INT,
@SchemaName VARCHAR(500),
@TableName VARCHAR(500),
@ColumnName VARCHAR(500)
WHILE EXISTS (SELECT * FROM @Commands) BEGIN
-- Get next set of records
SELECT TOP 1
@Id = Id,
@Sql = SqlCommand,
@SchemaName = SchemaName,
@TableName = TableName,
@ColumnName = ColumnName
FROM @Commands
-- Add values for that command
INSERT @Values
EXEC (@Sql)
-- Remove command record
DELETE @Commands WHERE Id = @Id
END
-- Return the values and sources
SELECT * FROM @Values