SQL:如何在存储过程动态中创建表名

时间:2014-08-16 13:32:03

标签: sql sql-server stored-procedures dynamic dynamic-programming

我是SQL Server的新手,希望有人可以帮助我(我使用的是QL Server 2008)。

以下是一个按预期工作的小程序。

现在我想使用相同的过程来更新多个表,因为所有这些表具有完全相同的列名和列格式,唯一的区别是我添加的表名的第二部分XXX下面。

有人能告诉我这是如何变得动态的,还能为我提供一些解释吗? 我不能在这里提供更多,因为我不确定如何处理这个 - 除了可能在执行它之前声明@sql nvarchar(max)并将整个查询包装在SET @sql = N'...'中。

我的存储过程:

    CREATE PROCEDURE [dbo].[Cal_UpdateTeam]
        @team nvarchar(100),
        @teamID int,
        @notes nvarchar(1000),
        @log nvarchar(100),
        @admin varchar(50)
    AS
    BEGIN
        SET NOCOUNT ON;

        BEGIN   

        IF NOT EXISTS 
        (
                SELECT  * 
                FROM    Cal_XXX
                WHERE   teamID = @teamID
        )
        INSERT INTO Cal_XXX
        (
                team,
                teamID,
                notes,
                log,
                admin
        )
        SELECT  @team,
                @teamID,
                @notes,
                @log,
                @admin
        ELSE
                UPDATE  Cal_XXX
                SET     team = @team,
                        teamID = @teamID,
                        notes = @notes,
                        log = @log,
                        admin = @admin
                WHERE   teamID = @teamID

        END
END

非常感谢任何提示和建议,迈克。

2 个答案:

答案 0 :(得分:3)

你应该将你的sql查询包装在nvarchar中,然后执行该查询,如下例所示:

    declare @sql nvarchar(max)
    declare @TableName nvarchar(max)
    set @TableName = 'mytable'
    set @sql = 'Select * from ' + @TableName
    Exec sp_executesql @sql

答案 1 :(得分:0)

在SP中,您可以使用示例临时表:

CREATE PROCEDURE SELECT_TABLE
    @REQUEST_ID INT
AS
BEGIN

/*************************************
** Temporary table                  **
*************************************/
    CREATE TABLE #SOURCE (
        ID        INT
      , ID_PARENT INT
      , NAME      VARCHAR(200)
      , SORT      INT
      ..
      ..
    )

IF @REQUEST_ID = 'YES' BEGIN
    INSERT INTO #SOURCE SELECT * FROM SOURCE_A
END
ELSE BEGIN
    INSERT INTO #SOURCE SELECT * FROM SOURCE_B
END

SELECT * FROM #SOURCE
.....


END

GO

在SP中,您可以使用其他表名(如参数)封装其他SP:

CREATE PROCEDURE SELECT_FROM_TABLE_A
AS
BEGIN
    SELECT * FROM SOURCE_A
END
GO
CREATE PROCEDURE SELECT_FROM_TABLE_B
AS
BEGIN
    SELECT * FROM SOURCE_B
END
GO

CREATE PROCEDURE SELECT_TABLE
    @REQUEST_ID INT

AS
BEGIN

/**********************************************
** Subrequest select                         **
**********************************************/

    IF @REQUEST_ID = 'YES' BEGIN
        -- Request SP fro Source A
        EXEC SELECT_FROM_TABLE_A
    END
    ELSE
    BEGIN
        -- Request SP fro Source B
        EXEC SELECT_FROM_TABLE_B
    END
END
GO