Q: ¿Cómo crear una tabla utilizando parámetros de stored procedures en sql server? Estoy intentando crear una lista de tablas cuyos nombres estarán precedidos por el nombre del usuario. Para ello he creado un stored procedure con el siguiente código.

STORED PROCEDURE
CREATE PROCEDURE [dbo].[CrearDatosUsuario]
@UserName varchar(50)
AS
GO
/**/----    *TABLAS*    ----/**/
----|   CREATE TABLE UserName.Tareas    |----
    CREATE TABLE [dbo].[@UserName + Tareas](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Titulo] [varchar](50) NOT NULL,
    [Tiempo] [int] NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO    
----|   CREATE TABLE UserName.Estados   |----
CREATE TABLE [dbo].[@UserName + Estados](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Nombre] [varchar](50) NOT NULL,
    [Valor] [float] NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
----|   CREATE TABLE UserName.TareasEstados |----
CREATE TABLE [dbo].[@UserName + TareasEstados](
    [IDTareas] [int] NOT NULL,
    [IDEstados] [int] NOT NULL
) ON [PRIMARY]
GO
----|   CREATE TABLE UserName.Descripciones |----
CREATE TABLE [dbo].[@UserName + Descripciones](
    [ID] [int] NOT NULL,
    [Descripcion] [varchar](500) NOT NULL
) ON [PRIMARY]
GO

El stored procedure se ejecuta sin errores pero cuando reviso la base de datos las tablas no tienen el nombre de usuario.

Resultado Esperado:


*

*Tablas


*

*dbo.JuanTareas

*dbo.JuanEstados

*dbo.JuanTareasEstados

*dbo.JuanDescripciones



Resultado Obtenido:


*

*Tablas


*

*dbo.@UserName + Tareas

*dbo.@UserName + Estados

*dbo.@UserName + TareasEstados

*dbo.@UserName + Descripciones



A: Es que no es válido hacerlo de la forma que lo haces, lamentablemente debes caer en una sentencia SQL dinámica. Supongamos que quieres crear una tabla JuanTareas, lo que debes hacer es construir la sentencia de creación en una variable y ejecutarla luego, veamos:
DECLARE @SQL        NVARCHAR(MAX)
DECLARE @UserName   VARCHAR(50)

SELECT  @UserName   = 'Juan'

SELECT @SQL = 'CREATE TABLE [dbo].[' + @UserName + 'Tareas](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Titulo] [varchar](50) NOT NULL,
    [Tiempo] [int] NOT NULL
)'

PRINT @SQL

EXEC sp_executesql @SQL

SELECT * FROM SYSOBJECTS WHERE name = 'JuanTareas'

En @SQL tenemos nuestra consulta de creación, que ejecutaremos mediante sp_executesql. El select final es simplemente para verificar que la tabla está correctamente creada.
