2013-04-03 45 views
2

我有一个游标,里面有一个alter table命令,我想用它在特定表中创建新列。列名将包含来自另一个表的一列中的值,这就是为什么我使用光标执行此操作的原因。无论如何,我不断收到此错误消息:Msg 173,Level 15,State 1,Line 1 'nvarchar'列的定义必须包含数据类型。。现在我宣布所有数据类型(嗯,我想我做了,我检查),我无法找到otu为什么我不断收到此消息。在Google上找不到任何类似的问题,所以我决定在本网站上询问我的第一个问题。希望能够快速回答。代码如下:列'nvarchar'的定义必须包含数据类型

DECLARE @rbr_param nvarchar(255) 
DECLARE @cName nvarchar(255) 
SET @cName = 'P_'[email protected]_param+'_P' 

DECLARE curs CURSOR FOR SELECT DISTINCT rbr_param FROM dbo.parametri_pomocna ORDER BY  rbr_param 
OPEN curs 
FETCH NEXT FROM curs 
INTO @rbr_param 
WHILE @@FETCH_STATUS = 0 
BEGIN 

EXEC('ALTER TABLE dbo.Parametri ADD ' + @cName + ' nvarchar(255)') 

FETCH NEXT FROM curs 
INTO @rbr_param 

END 
CLOSE curs 
DEALLOCATE curs 
+0

我有你的代码有问题。你已经把它标记为“mysql”,但你使用'+'作为字符串连接,以及'exec()'。你在使用SQL Server还是MySQL? –

+0

SQL Server ... exciedently我添加了mysql标记。我的不好 – Stojdza

+0

作为评论,绝对不要直接执行动态SQL字符串。将它分配给一个变量,然后执行它:'exec sp_executesql @ sql'然后如果你有奇怪的语法错误,你可以用'PRINT @ sql'来查看正在执行的实际字符串是什么。 – Pondlife

回答

2

@cName将不会随着@rbr_param更新的值自动更新。您需要移动此线路

SET @cName = 'P_'[email protected]_param+'_P' 

内部的循环。

+0

非常感谢你这个作品,拯救了我的一天! – Stojdza

+0

我的荣幸,请记住这些是脚本变量,它更像是一种替代模型,而不是您可能习以为常的参考模型。 – cmsjr

+0

好的建议不好,请记住。 – Stojdza

1

我想以后设置的值取..

DECLARE @rbr_param nvarchar(255) 
DECLARE @cName nvarchar(255) 

DECLARE curs CURSOR FOR SELECT DISTINCT rbr_param FROM dbo.parametri_pomocna ORDER BY  rbr_param 
OPEN curs 
FETCH NEXT FROM curs 
INTO @rbr_param 
WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @cName = 'P_'[email protected]_param+'_P' 

EXEC('ALTER TABLE dbo.Parametri ADD ' + @cName + ' nvarchar(255)') 

FETCH NEXT FROM curs 
INTO @rbr_param 

END 
CLOSE curs 
DEALLOCATE curs 
相关问题