1

我有一个外部游标和一个内部游标也有两个表可以使用。现在使用外部光标,我在表 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
4

1 回答 1

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
)

这就是为什么我更喜欢目录视图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;
于 2013-04-06T19:11:26.470 回答