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
我覺得在QUOTENAME的第二個參數必須是 ']'。或者乾脆刪除第二個參數,']'是默認值。 –
任何人都可以幫我編輯上面的腳本來創建一個真正的表格非臨時表格。 –