2015-10-24 111 views
0

我想使用動態表名和動態列名在SQL Server中創建一個動態表。例如:在SQL Server 2008中創建動態表名和表列?

表名:01-02-2015

列名:

Id 01 02 03.... 28 

當我創建一個臨時表是確定的,但我想創建一個表,然後我用下面這樣的腳本,當執行錯誤發生:

消息102,級別15,狀態1,行1個
附近有語法錯誤」 0.01' 。

代碼:

DECLARE @DynamicSQL as NVARCHAR(max),@TempTableName as nvarchar(max) 
DECLARE @TimeSheetDate as DateTime 
DECLARE @startDate AS DATETIME --Cursor Local Variables 
DECLARE @endDate AS DATETIME 

SET @TimeSheetDate = '2015-2-15' 
SET @startDate = DATEADD(mm, DATEDIFF(mm, 0, @TimeSheetDate), 0) -- the first day of month 
SET @endDate = DATEADD (dd, -1, DATEADD(mm, DATEDIFF(mm, 0, @TimeSheetDate) + 1, 0))-- the last day of month 
SET @TempTableName = @startDate -- the first day of month 

SET @DynamicSQL='CREATE TABLE dbo.'+ quotename(@TempTableName, '[') + '(Id int identity(1,1) not null primary key);'; 

WHILE (@startDate <= @endDate) 
BEGIN 
     --DECLARE @DynamicSQL VARCHAR(500) 

     BEGIN 
      SET @DynamicSQL = 'ALTER TABLE dbo.' + @TempTableName + 
           ' ADD ['+ CONVERT(VARCHAR(2), @startDate, 105) + '] NVARCHAR(max) NULL' 
      EXECUTE (@DynamicSQL) 
     END 

     SET @startDate = DateADD(dd, 1, @startDate) 

     IF @startDate - 1 = @endDate 
      BREAK; 
    END 

    exec (@DynamicSQL); 

如果我用這個腳本來創建一個臨時表是確定:

DECLARE @TempTableName as nvarchar(100) 
DECLARE @TimeSheetDate as DateTime 
DECLARE @startDate AS DATETIME --Cursor Local Variables 
DECLARE @endDate AS DATETIME 

SET @TimeSheetDate = '2015-2-15' 
SET @startDate = DATEADD(mm, DATEDIFF(mm, 0, @TimeSheetDate), 0) 
SET @endDate = DATEADD (dd, -1, DATEADD(mm, DATEDIFF(mm, 0, @TimeSheetDate) + 1, 0)) 
SET @TempTableName = DATEADD(mm, DATEDIFF(mm, 0, @TimeSheetDate), 0) 

if exists (select * from tempdb.dbo.sysobjects o where o.xtype in ('U') and o.id = object_id(N'tempdb..#@TempTableName')) 
    DROP TABLE #@TempTableName 

CREATE TABLE #@TempTableName(Id int identity(1,1) not null primary key) -- Creating Temp Table 

    -- Loop to add columns to temp table 
    WHILE (@startDate <[email protected]) 
    BEGIN 
     DECLARE @DynamicSQL VARCHAR(500) 

     BEGIN 
      SET @DynamicSQL = 'ALTER TABLE #@TempTableName ADD ['+ CONVERT(VARCHAR(2),@startDate,105) +'] NVARCHAR(100) NULL' 
      EXECUTE (@DynamicSQL) 
     END 

     SET @startDate = DateADD(dd,1,@startDate) 
     IF @startDate-1 = @endDate 
      BREAK; 
    END 

    SELECT * FROM #@TempTableName 
+0

我覺得在QUOTENAME的第二個參數必須是 ']'。或者乾脆刪除第二個參數,']'是默認值。 –

+0

任何人都可以幫我編輯上面的腳本來創建一個真正的表格非臨時表格。 –

回答

0

的問題是在你的ALTER TABLE語句。

變化

SET @DynamicSQL = 'ALTER TABLE dbo.' + @TempTableName + 
           ' ADD ['+ CONVERT(VARCHAR(2), @startDate, 105) + '] NVARCHAR(max) NULL' 

SET @DynamicSQL = 'ALTER TABLE dbo.' + quotename(@TempTableName, '[') + 
           ' ADD ['+ CONVERT(VARCHAR(2), @startDate, 105) + '] NVARCHAR(max) NULL' 
1

這工作對我的期望:

ALTER PROCEDURE [dbo].[proc_InsertTimeSheetInit] 
    @TimeSheetDate as DateTime 
AS 
BEGIN 

     DECLARE @DynamicSQL as NVARCHAR(255) 
     DECLARE @TableName as nvarchar(255) 
     DECLARE @startDate AS DATETIME 
     DECLARE @endDate AS DATETIME 
     DECLARE @dropSQL as NVARCHAR(255) 
     SET @startDate = DATEADD(mm, DATEDIFF(mm, 0, @TimeSheetDate), 0) -- the first day of month 
     SET @endDate = DATEADD (dd, -1, DATEADD(mm, DATEDIFF(mm, 0, @TimeSheetDate) + 1, 0))-- the last day of month 
     SET @TableName ='TS'+convert(nvarchar(2), datepart(mm, @TimeSheetDate)) + convert(nvarchar(4), datepart(yyyy, @TimeSheetDate)) 
     IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].['+ @TableName+ ']') AND type in (N'U')) 
     SELECT @dropSQL = 'DROP TABLE dbo.' + QUOTENAME(@TableName) + ''; 
     exec (@dropSQL) 
     SET @DynamicSQL = 'create table [dbo].[' + @TableName + ']([Id] [int] IDENTITY(1,1) NOT NULL,CONSTRAINT PK_'[email protected]+' PRIMARY KEY CLUSTERED (Id))' 
     exec (@DynamicSQL) 
     WHILE (@startDate <= @endDate) 
     BEGIN 

       BEGIN 
        SET @DynamicSQL = 'ALTER TABLE [dbo].[' + @TableName + '] ADD ['+ CONVERT(VARCHAR(2), @startDate, 105) + '] NVARCHAR(50) NULL' 
        EXECUTE (@DynamicSQL) 
       END 

       SET @startDate = DateADD(dd, 1, @startDate) 

       IF @startDate - 1 = @endDate 
        BREAK; 
      END 
END 
相關問題