我是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
非常感谢任何提示和建议,迈克。
答案 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