簡體   English   中英

SQL:如何使存儲過程中的表名動態化

[英]SQL: How to make table name in stored procedure dynamic

我對 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

非常感謝您的任何提示和建議,邁克。

您應該將 sql 查詢包裝在 nvarchar 中,然后按照以下示例執行該查詢:

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

在 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM