显示所有表SQL的一列中的所有文本字段

时间:2018-06-08 14:40:58

标签: sql sql-server sql-server-2008 tsql

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

这是我到目前为止所做的:

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...
...

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

2 个答案:

答案 0 :(得分:2)

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

  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
    

答案 1 :(得分:0)

M.Eedan,

您可以尝试按照以下方式使用光标:

DECLARE @YourTableName   varchar(1000)
DECLARE @YourColumns     varchar(max)
DECLARE @YourQuery       varchar(max)

DECLARE table_cursor CURSOR FOR

    SELECT name FROM SYS.tables WHERE TYPE = 'U'

OPEN table_cursor
FETCH NEXT FROM table_cursor INTO @YourTableName

WHILE @@FETCH_STATUS = 0
BEGIN

    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)
    FETCH NEXT FROM table_cursor INTO @YourTableName
END
CLOSE table_cursor   
DEALLOCATE table_cursor

这将为每个表提供单独的数据集。但请注意,在较大行和实验截断时,您可能会超出最大数据类型大小。