首页 > 解决方案 > 在所有表 SQL 的一列中显示所有文本字段

问题描述

我正在尝试将所有文​​本字段列合并为数据库中每一行和每个表的一列。我已经为指定的表执行此操作,但我想为所有表执行此操作。

这是我到目前为止所拥有的:

DECLARE @YourTableName   varchar(1000)
DECLARE @YourColumns     varchar(max)
DECLARE @YourQuery       varchar(max)
SET @YourTableName='COUNTRY'
SELECT
    @YourColumns=STUFF(
       (SELECT
            '+ ''$$'' +'
            + CASE
                  WHEN DATA_TYPE IN ('varchar','nvarchar','text','ntext','char','nchar') THEN '''' + [COLUMN_NAME] + '@@'' + ' + 'COALESCE(CONVERT(varchar(max),' + CONVERT(varchar(max),COLUMN_NAME)+'),''NULL'')'
              END
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE table_name = @YourTableName
            FOR XML PATH('')
       ), 1, 2, ''
      )
SET @YourQuery  = 'SELECT '+@YourColumns+' FROM '+@YourTableName
EXEC (@YourQuery)

我的输出将是这样的:

$$COUNTRY_NAME@@United States of America$$COUNTRY_CODE@@USA...
$$COUNTRY_NAME@@United Kingdom$$COUNTRY_CODE@@GBR...
$$COUNTRY_NAME@@France$$COUNTRY_CODE@@FRA...
...

我已经设置了表名,并且我想为数据库中的每个表执行这项工作,而不必指定每个表名。

标签: sqlsql-serversql-server-2008tsql

解决方案


基本上你可以尝试使用以下三种方法之一:

  1. 使用 Cursor 对每个表进行迭代,在一定程度上与下面第 3 项的方式相同,但可能会带来性能问题。

  2. 使用动态 SQL 构建@AllTables VARCHAR(MAX),但是会带来一个问题,如果你所有的表的总长度超过 8000,它就会不准确。

  3. 使用临时表迭代每个表。

    CREATE TABLE #TEMP
     (
        TABLENAME VARCHAR(500),
       [COUNTER] INT IDENTITY(1,1)
     )
    
     INSERT INTO #TEMP
     SELECT name
     FROM sys.tables
    
    
    DECLARE @YourTableName   varchar(1000)
    DECLARE @YourColumns     varchar(max)
    DECLARE @YourQuery       varchar(max)
    DECLARE @Control         int = 1
    
    WHILE (@Control <= (SELECT MAX([COUNTER]) FROM #TEMP))
    
    BEGIN
        SELECT @YourTableName = TABLENAME
        FROM #TEMP
        WHERE [COUNTER] = @Control
    
    SELECT
        @YourColumns=STUFF(
                       (SELECT
                            '+ ''$$'' +'
                            + CASE
                                  WHEN DATA_TYPE IN ('varchar','nvarchar','text','ntext','char','nchar') THEN '''' + [COLUMN_NAME] + '@@'' + ' + 'COALESCE(CONVERT(varchar(max),' + CONVERT(varchar(max),COLUMN_NAME)+'),''NULL'')'
                              END
                            FROM INFORMATION_SCHEMA.COLUMNS
                            WHERE table_name = @YourTableName
                            FOR XML PATH('')
                       ), 1, 2, ''
                      )
    
    SET @YourQuery  = 'SELECT '+@YourColumns+' FROM '+@YourTableName
    PRINT @YourQuery
    --EXEC (@YourQuery)
    SET @Control = @Control + 1
    
    END
    

推荐阅读