[英]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.