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 Comentarios

  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.

Dejar respuesta

Please enter your comment!
Please enter your name here