2009-12-17 4 views
6

Tengo una tabla que contiene muchas filas de comandos SQL que componen una sola declaración SQL (a la que estoy agradecido por esta respuesta, paso 5 here)Salida de contenido de SQL de una tabla a la cadena

he seguido el ejemplo en esta respuesta y ahora tiene una tabla de SQL: cada fila es una línea de SQL que crea una consulta. Puedo copiar y pegar el contenido de esta tabla en una nueva ventana de consulta y obtener los resultados debido a mi falta de conocimiento de SQL. No estoy seguro de cómo copio el contenido de la tabla en una variable de cadena que luego puedo ejecutar .

Editar: la instrucción SQL en mi mesa comprende de 1 fila por cada línea de la declaración es decir

Row1: SELECT * FROM myTable 
Row2: WHERE 
Row3: col = @value 

Esta declaración si copiado en un VARCHAR (MAX) supera el límite MAX.

Espero sus respuestas. mientras tanto, me probaré a mí mismo.

Gracias

Respuesta

9

Puede usar la combinación para estafar catene el contenido de una columna en una cadena, p.

create table foo (sql varchar (max)); 

insert foo (sql) values ('select name from sys.objects') 
insert foo (sql) values ('select name from sys.indexes') 

declare @sql_output varchar (max) 
set @sql_output = ''  -- NULL + '' = NULL, so we need to have a seed 
select @sql_output =  -- string to avoid losing the first line. 
     coalesce (@sql_output + sql + char (10), '') 
    from foo 

print @sql_output 

Nota: no probado, justo al lado de la parte superior de la cabeza, pero un ejemplo práctico de esto debería producir el siguiente resultado:

select name from sys.objects 
select name from sys.indexes 

A continuación, puede ejecutar el contenido de la cadena con exec (@sql_output) o sp_executesql.

+0

eso es bueno, gracias. El único problema que tengo es que mi tabla contiene más declaraciones de las que varchar (max) puede manejar.¿Cuál es otro tipo de datos adecuado que puedo usar? Estoy usando SQL Server 2008 si esto ayuda. – Belliez

1

Usted puede intentar algo como esto

DECLARE @TABLE TABLE(
     SqlString VARCHAR(MAX) 
) 

INSERT INTO @TABLE (SqlString) SELECT 'SELECT 1' 

DECLARE @SqlString VARCHAR(MAX) 

SELECT TOP 1 @SqlString = SqlString FROM @TABLE 

EXEC (@SqlString) 

cadena concatenación de varias filas

DECLARE @Table TABLE(
     ID INT, 
     Val VARCHAR(50) 
) 
INSERT INTO @Table (ID,Val) SELECT 1, 'SELECT *' 
INSERT INTO @Table (ID,Val) SELECT 2, 'FROM YourTable' 
INSERT INTO @Table (ID,Val) SELECT 3, 'WHERE 1 = 1' 

DECLARE @SqlString VARCHAR(MAX) 
--Concat 
SELECT DISTINCT 
     @SqlString = 
     (
      SELECT tIn.Val + ' ' 
      FROM @Table tIn 
      ORDER BY ID 
      FOR XML PATH('') 
     ) 
FROM @Table t 

PRINT @SqlString 
+0

la tabla que estoy convirtiendo en una cadena es más grande que VARCHAR (MAX)? ¿Puedes recomendar un tipo de datos adecuado? La tabla contiene alrededor de 400 filas. Gracias, esto es casi lo que estoy buscando. – Belliez

+0

Eche un vistazo aquí teratrax.com/articles/varchar_max.html. Afirma * Estos tipos de datos pueden contener la misma cantidad de datos BLOBs puede contener (2 GB) * –

+0

interesante, mi consulta sql definitivamente no pasa 2 GB !! Estoy usando VARCHAR (MAX) según su declaración anterior. – Belliez

0

si se desea ejecutar una serie de SQL a continuación, utilizar Exec() o sp_executeSql

Cuestiones relacionadas