从存储过程中的Passed In参数创建表

时间:2015-03-26 18:33:03

标签: sql sql-server stored-procedures sql-server-2012

所以,我正在制作一个“时间表”表。对于该程序在大学环境中创建的每个计划,我需要一个新表。所以,我需要一个SPRING2015,FALL2015等。这就是我想要的表格名称。我们将时间表输入到基本SCHEDULE表中。存储过程必须以“FALL2015”表示,并将表格设为“FALL2015”。我还没有找到一个很好的方法来做到这一点。我似乎只能创建一个临时表或具有静态名称的表。我们需要从SCHEDULE表复制到在同一过程中制作的'FALL2015'表中的所有内容。那不是问题。我只需要找到将变量传入表名的过程。我似乎无法找到一个好方法。

CREATE PROCEDURE CreateScheduleTable 
    @TableName VARCHAR(255)
AS
BEGIN

CREATE TABLE @TableName (
    ClassID INT,
    SectionNum VARCHAR(2) NOT NULL,
    StartTime INT,
    EndTime INT,
    Mon BIT,
    Tues BIT,
    Wed BIT,
    Thurs BIT,
    Fri BIT,
    Sat BIT,
    Sun BIT,
    TeacherID VARCHAR(6),
    RoomID INT,
    CONSTRAINT pk_Class PRIMARY KEY (ClassID, SectionNum)
)

    INSERT INTO @TableName
    (ClassID, SectionNum, StartTime, EndTime, Mon, Tues, Wed, Thurs, Fri, Sat, Sun, TeacherID)
    SELECT ClassID, SectionNum, StartTime, EndTime, Mon, Tues, Wed, Thurs, Fri, Sat, Sun, TeacherID
    FROM SCHEDULE


END
GO
-- End Procedure CreateScheduleTable --

EXEC CreateScheduleTable 'Hi'

SELECT * FROM #TempSchedule

1 个答案:

答案 0 :(得分:2)

不知道为什么要创建这么多具有​​相同模式的表的原因,我通常会在表中添加一列来标记SPRING2015, FALL2015,.... etc的记录....

无论如何,你可以通过使用动态sql来做到这一点....

CREATE PROCEDURE CreateScheduleTable 
    @TableName SYSNAME
AS
BEGIN
 SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX); 

DECLARE @ConstraintName SYSNAME = @TableName + 'pk_Class'

SET @SQL = N' CREATE TABLE ' + QUOTENAME(@TableName) 
         + N' ( ClassID INT,
                SectionNum VARCHAR(2) NOT NULL,
                StartTime INT,
                EndTime INT,
                Mon BIT,
                Tues BIT,
                Wed BIT,
                Thurs BIT,
                Fri BIT,
                Sat BIT,
                Sun BIT,
                TeacherID VARCHAR(6),
                RoomID INT,
                CONSTRAINT '+ QUOTENAME(@ConstraintName) 
          + N' PRIMARY KEY (ClassID, SectionNum) )'

 Exec sp_executesql @SQL

 SET @SQL = N' INSERT INTO '+ QUOTENAME(@TableName) + N'
            (ClassID, SectionNum, StartTime, EndTime, Mon, Tues, Wed, Thurs, Fri, Sat, Sun, TeacherID)
             SELECT ClassID, SectionNum, StartTime, EndTime, Mon, Tues, Wed, Thurs, Fri, Sat, Sun, TeacherID
            FROM SCHEDULE'

   Exec sp_executesql @SQL

END
GO