SQL:如何使存储过程中的表名动态化

Mik*_*ike 3 sql sql-server stored-procedures 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
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*Sam 7

您应该将 sql 查询包装在 nvarchar 中,然后按照以下示例执行该查询:

    declare @sql nvarchar(max)
    declare @TableName nvarchar(max)
    set @TableName = 'mytable'
    set @sql = 'Select * from ' + @TableName
    Exec sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)