我有什么方法可以在表格中添加一个列但我希望标题是一个日期,并且添加的每个新列都会有第二天的列标题,因此
SET @date1 = @date1 + 1
我希望表格看起来像是,顶部的日期是脚本循环的每一天的新列:
StoreID StoreName 02/01/12 03/01/12 04/01/12
1234 Coles1 7512 8574
1235 Coles2 7210 8441
1236 Coles3 4845 5448
当我运行脚本时,我收到以下错误消息:
Msg 170,Level 15,State 1,Line 1
第1行:'@Column'附近的语法不正确。
消息170,级别15,状态1,行1 第1行:'@Column'附近的语法不正确。
这是我的剧本:
DECLARE @date datetime
DECLARE @date1 datetime
DECLARE @date2 datetime
DECLARE @Column varchar(8)
SET @date = '02 Jan 2012'
SET @date1 = '02 Jan 2012'
SET @date2 = '08 Jan 2012'
SET @Column = CONVERT(VARCHAR(8), @date1, 3)
IF NOT EXISTS (SELECT * FROM sysobjects WHERE xtype = 'U' AND name = '#vl_temp_trans')
BEGIN
CREATE TABLE #vl_temp_trans
(StoreID INT,
StoreName VARCHAR(100),
@Column MONEY) ----> column name to be date "@Column)
END
WHILE (@date1 <= @date2)
BEGIN
SET @Column = CONVERT(VARCHAR(8), @date1, 3)
ALTER table #vl_temp_trans
ADD @Column MONEY ----> column name to be date "@Column"
Insert into #vl_temp_trans (storeID, storeName, @Column)
select storeId, storeName, TotalDailyTransactions
from daily_trans t1 (nolock)
full outer join outlets t2 (nolock) on t1.StoreID = t2.StoreID
where DailyEnd = @date1 + 1
SET @date1 = @date1 + 1
END
答案 0 :(得分:2)
如果没有动态SQL,则无法执行此操作。这是一个可以获得您想要的结果的查询。非常欢迎您取消注释--INTO #t
位,但是不清楚除了那个之外你想用#temporary表做什么(如果你告诉我们最终结果,而不是“我想添加一个列名”作为@column,也许我们也可以提供帮助。)为了继续引用#t表,你需要继续使用同一范围内的代码 - 这意味着在同一个{{1}内执行更多动态SQL打电话。
sp_executesql
答案 1 :(得分:0)
我认为问题在于您无法使用变量来定义列名。
我使用了一些代码进行测试。第一部分执行得很好。
DECLARE @date1 datetime
DECLARE @Column varchar(8)
SET @date1 = '02 Jan 2012'
SET @Column = CONVERT(VARCHAR(8), @date1, 3)
select @Column
但是当我添加CREATE TABLE语句并立即执行所有这些语句时,我遇到了同样的错误。
CREATE TABLE #vl_temp_trans
(StoreID INT,
StoreName VARCHAR(100),
@Column MONEY) ----> column name to be date "@Column)
为此,您需要将CREATE TABLE和ALTER TABLE语句构建为字符串,然后使用EXECUTE或sp_executesql执行这些语句。 search for "dynamic sql"也会给你一些描述这一点的文章。
答案 2 :(得分:0)
执行此代码需要做两件事......
SP_ExecuteSQl
请查看以下代码,由我确定更新您的问题
DECLARE @date datetime
DECLARE @date1 datetime
DECLARE @date2 datetime
DECLARE @ColumnNAAME varchar(8)
Declare @Query NVARCHAR(1000)
DECLARE @ParmDefinition NVARCHAR(500);
SET @date = getdate()
SET @date1 = getdate()
SET @date2 = getdate()
SET @ColumnNAAME = CONVERT(VARCHAR(8), @date1, 3)
IF NOT EXISTS (SELECT * FROM sysobjects WHERE xtype = 'U' AND name = '#vl_temp_trans')
BEGIN
SET @ParmDefinition = N'@Column varchar(8)';
Set @Query = 'CREATE TABLE ##vl_temp_trans (StoreID INT, StoreName VARCHAR(100), ['+@ColumnNAAME+'] MONEY)'
EXECUTE sp_executesql @Query,@ParmDefinition,
@Column = @ColumnNAAME;
----> column name to be date "@Column)
SELECT * from ##vl_temp_trans
END
ELSE
BEGIN
SELECT * from ##vl_temp_trans
END