2011-04-12 20 views
7

Tengo una tabla con un varbinary (max) Campo (SQL Server 2008 con FILESTREAM)¿Cómo puedo generar un script de inserción para una tabla con un campo VARBINARIO (MAX)?

Mi requisito es que cuando voy a implementar en prod, sólo puedo proporcionar mi equipo de TI con un grupo de scripts SQL para ser ejecutado en cierto orden Una nueva tabla que estoy haciendo en producción tiene este campo VARBINARIO (MAX). Por lo general, con las tablas nuevas, voy a script el script CREATE TABLE. Y si tengo datos, necesito ir con ellos, y luego crearé los guiones INSERT. No es demasiado complicado.

Pero con VARBINARY (MAX), el procedimiento almacenado que estaba utilizando para generar las instrucciones de inserción falla en esa tabla. Intenté seleccionar ese campo, imprimirlo, copiarlo, convertirlo a hexadecimal, etc. El principal problema que tengo es que no selecciona todos los datos en el campo. Hago una comprobación DATALENGTH ([FileColumn]) y si la fila de origen contiene un valor de 1004382, el máximo que puedo obtener los datos copiados o seleccionados cuando se inserta de nuevo es 8000. Por lo tanto, básicamente se trunca, es decir, datos no válidos ....

¿Cómo puedo hacer esto mejor? Intenté buscar en Google esto como loco pero debo estar perdiendo algo. Recuerde, no puedo acceder al sistema de archivos. Tiene que ser todo guionado.

Respuesta

5

no hacer script desde SSMS

bcp los datos de salida/entrada, o usar algo como SSMS tools para generar instrucciones INSERT

+0

SSMS Tools es IMPRESIONANTE !!!! Hizo el trabajo. GRACIAS –

0

Nunca antes había intentado algo como esto, pero a partir de la documentación de SQL Server 2008 R2, parece que usar SUBSTRING funcionará para obtener todo el valor varbinary, aunque es posible que deba trabajar en fragmentos, utilizando UPDATE s con la cláusula .WRITE para agregar los datos.

actualizar grandes tipos de datos de valor

Uso del .WRITE (expresión, @Offset, @Length) Cláusula de realizar una actualización parcial o total de varchar (max), nvarchar (max), y tipos de datos varbinary (max). Por ejemplo, una actualización parcial de una columna varchar (max) podría eliminar o modificar solo los primeros 200 caracteres de la columna, mientras que una actualización completa eliminaría o modificaría todos los datos en la columna.

Para un mejor rendimiento, recomendamos que los datos se inserten o actualicen en tamaños de fragmentos que son múltiplos de 8040 bytes.

Espero que esto ayude.

+0

¿Puede dar un poco más de detalle? Gracias por toda la ayuda hasta ahora. –

+0

@Issa Fram, no estoy seguro de cómo se genera la secuencia de comandos, pero podría intentar usar 'SUBSTRING' con' DATALENGTH' para obtener todo el valor varbinary. Si eso funciona y produce una instrucción de inserción utilizable en su secuencia de comandos, entonces estaría listo. Si no fuera así, podría intentar usar un bucle para tomar fragmentos de los datos varbinary (digamos 8040 bytes) y crear declaraciones de actualización para escribir esos fragmentos en la fila de destino. Pero con suerte, usar 'SUBSTRING' para obtener el valor completo funcionará. –

3

Si se trata de una sola vez (o rara vez) que hay que hacer, se puede tratar de secuencias de comandos los datos desde el Asistente SSMS como se describe aquí:

http://sqlblog.com/blogs/eric_johnson/archive/2010/03/08/script-data-in-sql-server-2008.aspx

O, si usted necesita para hacer esto con frecuencia y desea automatizarlo, puede probar la biblioteca SQL # (que escribí y, aunque la mayor parte es gratuita, la función que necesita aquí no). La función para hacer esto es DB_DumpData y también genera instrucciones INSERT. La biblioteca se puede encontrar en: http://www.SQLsharp.com/.

Pero, de nuevo, si se trata de una tarea única o infrecuente, intente con el asistente de exportación de datos que está integrado en Management Studio. Eso debería permitirle crear el script SQL que puede ejecutar en Producción. Acabo de probar esto en una tabla con un campo VARBINARIO (MÁXIMO) que contiene 3,365,964 bytes de datos y el asistente Generar Scripts generó una instrucción INSERT con toda la cadena hexadecimal de 6,73 millones de caracteres para ese valor.

EDIT:
Otra forma rápida y fácil de hacer esto de una manera que le permita copiar/pegar toda la instrucción INSERT en una secuencia de comandos SQL y no tiene que molestarse con el BCP o SSMS Asistente para exportación es de convertir sólo el valor para XML. Primero CONVERTIRÁ el VARBINARIO a VARCHAR (MAX) usando el estilo opcional de "1" que le da una secuencia hexadecimal que comienza con "0x". Una vez que tiene la cadena hexadecimal de los datos binarios puede concatenar eso en una instrucción INSERT y todo eso, cuando se convierte a XML, puede contener todo el campo VARBINARIO. Véase el siguiente ejemplo:

DECLARE @Binary VARBINARY(MAX) = CONVERT(VARBINARY(MAX), 
             REPLICATE(
              CONVERT(NVARCHAR(MAX), 'test string'), 
              100000) 
             ) 

SELECT 'INSERT INTO dbo.TableName (ColumnName) VALUES ('+ 
     CONVERT(VARCHAR(MAX), @Binary, 1) + ')' AS [Insert] 
FOR XML RAW 
1

Es más que un poco en mal estado, pero en el pasado y en la web que he visto este hecho mediante una cadena codificada en base64. Utiliza un valor xml para envolver la cadena y desde allí puede convertirla a varbinary. Aquí hay un ejemplo:
http://blogs.msdn.com/b/sqltips/archive/2008/06/30/converting-from-base64-to-varbinary-and-vice-versa.aspx

Sin embargo, no puedo hablar personalmente de cuán efectivo o de rendimiento es esto, especialmente para valores grandes. Como en el mejor de los casos es un hack feo, lo guardaría dentro de un UDF en alguna parte, de modo que si se encuentra un método mejor, puedes actualizarlo fácilmente.

Cuestiones relacionadas