Ver Mensaje Individual
  #10 (permalink)  
Antiguo 01/07/2010, 11:33
Avatar de iislas
iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 8 meses
Puntos: 180
Respuesta: Concatenar al crear tabla

Eso ya se habia preguntado con anterioridad, lo vuelvo a colocar:

Para ejecutar una cadena, se recomienda utilizar el procedimiento almacenado sp_executesql, en lugar de una instrucción EXECUTE. Puesto que este procedimiento almacenado admite la sustitución de parámetros, sp_executesql es no sólo más versátil que EXECUTE, sino que, como además genera planes de ejecución con más probabilidades de que SQL Server los vuelva a utilizar, resulta más eficaz que éste

Cuando sp_executesql o la instrucción EXECUTE ejecutan una cadena, ésta se ejecuta como su propio lote independiente. SQL Server compila la instrucción o instrucciones Transact-SQL de la cadena en un plan de ejecución independiente del plan de ejecución del lote que contenía sp_executesql o la instrucción EXECUTE. Para los lotes independientes se aplican las siguientes reglas:

Las instrucciones Transact-SQL de la cadena EXECUTE o sp_executesql no se compilan en un plan de ejecución hasta que la instrucción EXECUTE o sp_executesql se han ejecutado. Las cadenas no se analizan ni se comprueba que tengan errores hasta que se han ejecutado. Los nombres a los que se hace referencia en las cadenas no se resuelven hasta que se han ejecutado.

Las instrucciones Transact-SQL de la cadena ejecutada no tienen acceso a ninguna de las variables declaradas en el lote que contiene la instrucción EXECUTE o sp_executesql. El lote que contiene la instrucción EXECUTE o sp_executesql no tiene acceso a las variables o cursores locales definidos en la cadena ejecutada.

Si la cadena ejecutada contiene una instrucción USE que cambia el contexto de la base de datos, este cambio sólo dura hasta que finaliza la ejecución de sp_executesql o la instrucción EXECUTE.

La ejecución de los dos lotes siguientes muestra estos puntos:

/*Show not having access to variables from the calling batch. */
DECLARE @CharVariable CHAR(3);
SET @CharVariable = 'abc';
/* sp_executesql fails because @CharVariable has gone out of scope. */
EXECUTE sp_executesql N'PRINT @CharVariable';
GO

/* Show database context resetting after sp_executesql finishes. */
USE master;
GO
EXECUTE sp_executesql N'USE AdventureWorks;'
GO
/* This statement fails because the database context
has now returned to master. */
SELECT * FROM Sales.Store;
GO