Cómo recorrer todas las columnas de todas las tablas de base de datos SQL server y volver a los nombres de columna se yuxtaponen con los valores de la columna?

Necesito un bucle a través de todas las tablas de mi base de datos sql server y para cada tabla, devolución de valores de todas las filas, pero el truco es que necesito el nombre de la columna de metadatos volvió de lado a lado con el valor para esa columna.

Por ejemplo,

column1 collumn2 column3
A   B   C
AA  BB  CC

para esta tabla, necesito volver

column1     A   collumn2    B   column3 C
column1     AA  collumn2    BB  column3 

CC

He secuencia de comandos utilizando el cursor para recorrer todas las tablas y dentro de cada tabla, devolver todas las columnas » nombre (pero no de valor).

También tengo el script de devolución de los nombres de columna y los valores de uno en uno, como

column1 A
column1 AA
column2 B
column2 BB
column3 C
column3 CC

Pero tengo que devolver una fila de la columna metadat + columna vaue para cada fila de datos. ¿Alguien tiene alguna visión? Todavía estoy hurgando. Gracias!

Editado:
Finalmente llegué a la secuencia de comandos de trabajo

drop table #results
CREATE TABLE #Results (TypeColumnName nvarchar(100), TypeColumnValue int, CodeValueName nvarchar(100), CodeValueValue nvarchar(100), DescriptionName nvarchar(100), DescriptionValue nvarchar(1024) )

    SET NOCOUNT ON

    DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @sql nvarchar(max), @sql0 nvarchar(max)
    SET  @TableName = ''


    WHILE @TableName IS NOT NULL
    BEGIN

        SET @ColumnName = ''
        set @sql=''
        SET @TableName = 
        (
            SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
            FROM    INFORMATION_SCHEMA.TABLES
            WHERE       TABLE_TYPE = 'BASE TABLE'
            and table_schema = 'test'
            and table_name like 'sales%'
                AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
        )

        WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
        BEGIN

            SET @ColumnName =
            (
                SELECT MIN(QUOTENAME(COLUMN_NAME))
                FROM    INFORMATION_SCHEMA.COLUMNS
                WHERE       TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                    AND TABLE_NAME  = PARSENAME(@TableName, 1)
                    AND QUOTENAME(COLUMN_NAME) > @ColumnName
            )
            IF @ColumnName IS NOT NULL
            BEGIN
                --select @columnname
                set @sql = @sql + '''' + @TableName + '.' + @ColumnName + ''',' + @ColumnName + ', '

            END
            ELSE
            begin
            SET @sql = left(rtrim(@sql),Len(rtrim(@sql))-1) 
            set @sql = 'SELECT ' + @sql +   ' FROM ' + @TableName + ' (NOLOCK) ' 

    select @sql 
    INSERT INTO #Results
                EXEC sp_executesql @sql 
    end


END

end
  • ¿Qué idioma de programación en? Donde usted quiere que su salida a ir? A un archivo? A la pantalla?
  • Tal vez si usted dice que lo que están haciendo con los datos, podemos asesorar mejor.
  • T-SQL. Quiero que la salida para ir a una tabla temporal global. Gracias!
  • Estoy necesitando esta salida como voy a ser un bucle a través de esta salida y construir CASO CUANDO las declaraciones de uso de los nombres de columna y los valores. Gracias
InformationsquelleAutor Wendy | 2014-05-12

2 Kommentare

  1. 1

    Hace esto a empezar ?

    select t.name, c.name, c.system_type_id , c.max_length 
             ,Case c.system_type_id
             when 167 then 'VarChar'
             When 231 then 'nVarChar'
             when 4 then 'Integer'
             when 56 then 'int'
             when 61 then 'DateTime'
             else 'Unknown'
             End 
       from sys.tables t
     inner join sys.columns c
        on c.object_id = t.object_id 
     order by t.name, c.column_ID

    Este T-SQL que me tocaron juntos funciona en SQL Server 2008 R2

    Puede utilizar sp_help de averiguar otros ‘desconocido’ tipos de columna y agregarlos en el caso de declaración de ti mismo.

    • Muchas gracias @cometbill – este, por desgracia, sólo me da metadatos, mientras que necesito mirar a los valores reales de la columna, además del nombre de la columna para que yo pueda construir caso de declaración. Esto es principalmente para las tablas de búsqueda, los cuales, por ejemplo, el código y la descripción de columnas, de manera que se puede construir caso de declaración como caso cuando [código nombre de la columna] = ‘código de valor» y, a continuación, [descripción nombre de columna] = ‘descripción valor’
    • desea que los metadatos Y los datos? usted puede determinar el tipo de campo una vez que se tiene el campo con algunos datos en ella. No estoy seguro de por qué usted quiere wset la descripción valor sólo si el valor de código de un código. Estoy confuzzled.
  2. 0

    Utilizar el UNPIVOT funcionalidad:

    SELECT col1, colval
    FROM (
    SELECT col1, col2, col3
    FROM table1
    ) UNPIVOT (
    colval for colname IN (col2, col3)
    ) as unpiv

    Puede agregar une y donde las cláusulas en diferentes puntos de filtrar sin embargo que usted necesita. En una de mis aplicaciones me filtra y se unieron en la primera consulta, luego se unió el resultado final a un par de mesas, etc…

    También se puede hacer a la inversa con el PIVOTE de la funcionalidad de una forma muy similar. Echa un vistazo a los Libros en Línea para estas dos funciones… yo creo que van a resolver el problema para usted.

    • Juan, me olvidé de UNPIVOT función – yo sólo experimentado un poco y todavía no funciona para resolver mi caso como yo también la necesidad de extracción de los nombres de columna. Pero es bueno tener esa mano. Gracias!
    • Cuando lo ejecuto, me sale los nombres de columna y los valores correspondientes. Así que, básicamente, toma mi ancho de la tabla, y lo hace en una mesa alta. Creo que si sigues tratando de que va a hacer lo que usted necesita.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea