从每个 table 和 SQL Server 2008 上的字段获取所有不同值的游标
Cursor to get all distinct values from each table and field on SQL Server 2008
我正在尝试在 SQL 服务器数据库上做一个游标,以从每个 table 中获取所有不同的值。
我希望 table 的值看起来像这样:
Database Schema Table Field Value
A dbo T1 F1 1
A dbo T1 F1 2
A dbo T1 F1 3
... ... ... ... ...
我的问题是,当我尝试使用 QUOTENAME(TABLE_CATALOG) 放置数据库名称时,它不会计算函数,而是将函数写入 table我想生成的。
我试过 single/double 引号但没有结果。
¿我应该如何编写查询?谢谢!
Set Nocount ON
DECLARE cur CURSOR FOR
SELECT 'SELECT DISTINCT ' + ''' QUOTENAME(TABLE_CATALOG) + '''+' As DBName,'+ + QUOTENAME(c.COLUMN_NAME) + ' AS Datos' + ' FROM ' + QUOTENAME(TABLE_CATALOG) + '.' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS AS c
WHERE c.DATA_TYPE LIKE '%char%'
DECLARE @cmd VARCHAR(MAX);
OPEN cur;
FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @cmd
EXEC(@cmd);
FETCH NEXT FROM cur INTO @cmd;
END
CLOSE cur;
DEALLOCATE cur;
Set Nocount OFF
顺便说一句:我拿了代码并根据示例对其进行了编辑 ()
您在 ''' QUOTENAME(TABLE_CATALOG) + '''
中的引号不太正确。应该是 ''' + QUOTENAME(TABLE_CATALOG) + '''
.
引号通过加倍转义,例如
SELECT 'blah' --> blah
SELECT 'it''s' --> it's
SELECT ' Alex''' + 's pen' --> Alex's pen
语法错误
SELECT 'it's' --> syntax error
完成的查询在这里:
SET NOCOUNT ON
DECLARE cur CURSOR FOR
SELECT 'SELECT DISTINCT ''' + QUOTENAME(TABLE_CATALOG) + ''' As DBName, ''' + QUOTENAME(TABLE_SCHEMA) + ''' AS [Schema], ''' + QUOTENAME(COLUMN_NAME) + ''' AS ColumnName, '
+ QUOTENAME(c.COLUMN_NAME) + ' AS Datos ' +
'FROM ' + QUOTENAME(TABLE_CATALOG) + '.' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS AS c
WHERE c.DATA_TYPE LIKE '%char%'
DECLARE @cmd VARCHAR(MAX);
OPEN cur;
FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @cmd
EXEC(@cmd);
FETCH NEXT FROM cur INTO @cmd;
END
CLOSE cur;
DEALLOCATE cur;
SET NOCOUNT OFF
备注:
- 如果您不想让字符串被
[]
(方括号) 包围,请删除 QUOTENAME
- 关于
INFORMATION_SCHEMA.COLUMNS
的评论:出于您的目的,此视图将 return 更正 中所述的数据(@ShannonSeverance 的评论)。此视图缺少的是有关列属性的详细信息。
我正在尝试在 SQL 服务器数据库上做一个游标,以从每个 table 中获取所有不同的值。 我希望 table 的值看起来像这样:
Database Schema Table Field Value
A dbo T1 F1 1
A dbo T1 F1 2
A dbo T1 F1 3
... ... ... ... ...
我的问题是,当我尝试使用 QUOTENAME(TABLE_CATALOG) 放置数据库名称时,它不会计算函数,而是将函数写入 table我想生成的。 我试过 single/double 引号但没有结果。
¿我应该如何编写查询?谢谢!
Set Nocount ON
DECLARE cur CURSOR FOR
SELECT 'SELECT DISTINCT ' + ''' QUOTENAME(TABLE_CATALOG) + '''+' As DBName,'+ + QUOTENAME(c.COLUMN_NAME) + ' AS Datos' + ' FROM ' + QUOTENAME(TABLE_CATALOG) + '.' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS AS c
WHERE c.DATA_TYPE LIKE '%char%'
DECLARE @cmd VARCHAR(MAX);
OPEN cur;
FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @cmd
EXEC(@cmd);
FETCH NEXT FROM cur INTO @cmd;
END
CLOSE cur;
DEALLOCATE cur;
Set Nocount OFF
顺便说一句:我拿了代码并根据示例对其进行了编辑 (
您在 ''' QUOTENAME(TABLE_CATALOG) + '''
中的引号不太正确。应该是 ''' + QUOTENAME(TABLE_CATALOG) + '''
.
引号通过加倍转义,例如
SELECT 'blah' --> blah
SELECT 'it''s' --> it's
SELECT ' Alex''' + 's pen' --> Alex's pen
语法错误
SELECT 'it's' --> syntax error
完成的查询在这里:
SET NOCOUNT ON
DECLARE cur CURSOR FOR
SELECT 'SELECT DISTINCT ''' + QUOTENAME(TABLE_CATALOG) + ''' As DBName, ''' + QUOTENAME(TABLE_SCHEMA) + ''' AS [Schema], ''' + QUOTENAME(COLUMN_NAME) + ''' AS ColumnName, '
+ QUOTENAME(c.COLUMN_NAME) + ' AS Datos ' +
'FROM ' + QUOTENAME(TABLE_CATALOG) + '.' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS AS c
WHERE c.DATA_TYPE LIKE '%char%'
DECLARE @cmd VARCHAR(MAX);
OPEN cur;
FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @cmd
EXEC(@cmd);
FETCH NEXT FROM cur INTO @cmd;
END
CLOSE cur;
DEALLOCATE cur;
SET NOCOUNT OFF
备注:
- 如果您不想让字符串被
[]
(方括号) 包围,请删除 - 关于
INFORMATION_SCHEMA.COLUMNS
的评论:出于您的目的,此视图将 return 更正 中所述的数据(@ShannonSeverance 的评论)。此视图缺少的是有关列属性的详细信息。
QUOTENAME