我有一个外部游标,一个内部游标也有两个表可供使用。现在使用外部光标我在表1中创建新列,并使用表2中的值命名它们,这样就可以了。问题在于内部光标我曾经将值插入来自另一个表的一个特定列的新列中。这种接缝无法正常工作,但令我困惑的是我没有收到任何错误消息。现在我希望你理解我想要做的事情,这里是代码所以评论更多关于这个问题的描述:
DECLARE @rbr_param nvarchar(255)
DECLARE @vrednost nvarchar(255)
DECLARE @cName nvarchar(255)
DECLARE @sql 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_'+@rbr_param+'_P'
EXEC('ALTER TABLE dbo.Parametri ADD ' + @cName + ' nvarchar(255)')
DECLARE vrd CURSOR FOR SELECT DISTINCT vrednost FROM dbo.parametri_pomocna
OPEN vrd
FETCH NEXT FROM vrd
INTO @vrednost
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'INSERT INTO dbo.Parametri'+(@cName)+ ' SELECT vrednost FROM dbo.parametri_pomocna WHERE vrednost = '+@vrednost+ ' AND rbr_param = '+@rbr_param
if exists (select * from INFORMATION_SCHEMA.COLUMNS where table_name = 'dbo.Parametri' and column_name = '@cName')
begin
exec(@sql)
end
FETCH NEXT FROM vrd
INTO @vrednost
END --end vrd
CLOSE vrd
DEALLOCATE vrd
FETCH NEXT FROM curs
INTO @rbr_param
END
CLOSE curs
DEALLOCATE curs
答案 0 :(得分:2)
这里有两个问题:
if exists ( select * from INFORMATION_SCHEMA.COLUMNS
where table_name = 'dbo.Parametri'
and column_name = '@cName'
)
(1)此视图永远不会有table_name
=架构名称和表名。
(2)由于某种原因,您已将变量名称括在单引号中。
由于这两个原因,您的IF
条件永远不会返回true。
尝试:
IF EXISTS
(
SELECT 1 FROM sys.columns
WHERE [object_id] = OBJECT_ID('dbo.Parametri')
AND name = @cName
)
(And here is why I prefer catalog views over INFORMATION_SCHEMA
。)
这个双嵌套游标的东西看起来效率很低,而且代码要比实现我认为你要做的更多。这样的事情怎么样呢:
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + N'ALTER TABLE dbo.Parametri ADD '
+ QUOTENAME('P_' + rbr_param + '_P') + ' NVARCHAR(255);'
FROM dbo.parametri_pomocna GROUP BY rbr_param;
EXEC sp_executesql @sql;
SET @sql = N'';
SELECT @sql = @sql + N'INSERT dbo.Parametri('+QUOTENAME('P_' + rbr_param + '_P')+ ')
SELECT vrednost
FROM dbo.parametri_pomocna WHERE rbr_param = ''' + rbr_param + '''
GROUP BY vrednost;'
FROM dbo.parametri_pomocna
GROUP BY rbr_param;
EXEC sp_executesql @sql;