从每个 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 的评论)。此视图缺少的是有关列属性的详细信息。