【问题标题】:Create a Table from a Passed In Parameter in a Stored Procedure从存储过程中传入的参数创建表
【发布时间】:2015-03-26 18:33:02
【问题描述】:

所以,我正在制作一个“时间表”表。对于该程序在大学环境中创建的每个时间表,我都需要一个新表。所以,我需要一个用于 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

【问题讨论】:

  • 你为什么要创建这么多表?只需一张表,其中一列表示年份,一列表示季节。然后你有一张表来管理和报告。如果您必须按照自己的方式进行操作,请使用动态 SQL。

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


【解决方案1】:

不知道为什么要创建这么多具有​​相同架构的表,我通常会在表中添加一列以标记 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

【讨论】:

  • 我们决定采用将 SPRING 2015 添加到表中的路线。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多