2013-04-06 94 views
1

我有一個外部遊標,一個內部遊標也有兩個表來使用。現在用外部遊標,我在表1中創建新列,並使用表2中的值命名它們,這很好。問題在於用於將值插入到另一個表中某個特定列的新列中的內部遊標女巫。這接合不起作用,但令我困惑的是我沒有收到任何錯誤信息。現在,我希望你明白我想要做的,這裏是代碼所以對有關問題的詳細說明註釋:INSERT INTO命令不起作用

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_'[email protected]_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 = '[email protected]+ ' AND rbr_param = '[email protected]_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

圍繞'INSERT'中的'SELECT'語句嘗試wrapping()。 'INSERT INTO dbo.Parametri'+(@ cName)+'(SELECT vrednost FROM dbo.parametri_pomocna WHERE vrednost ='+ @ vrednost +'AND rbr_param ='+ @ rbr_param +')' – 2013-04-06 19:06:53

+0

我試過了,但仍然一樣...沒有錯誤,但也沒有插入任何錯誤 – Stojdza 2013-04-06 19:12:21

+4

這只是解決這個問題的最糟糕的方法:它似乎幾乎沒有任何關係概念。即使程序奏效,我也確信它所做的並不是你想要的東西(除非數據設計比我想象的要糟得多)。 – RBarryYoung 2013-04-06 19:46:57

回答

2

您這裏有兩個問題:

if exists (select * from INFORMATION_SCHEMA.COLUMNS 
    where table_name = 'dbo.Parametri' 
     and column_name = '@cName' 
) 

(1)查看不會有table_name =模式名稱表名。 (2)出於某種原因,您已將變量名用單引號引起來。

由於這兩個原因,您的IF條件永遠不會返回true。

嘗試:(And here is why I prefer catalog views over INFORMATION_SCHEMA

IF EXISTS 
(
    SELECT 1 FROM sys.columns 
     WHERE [object_id] = OBJECT_ID('dbo.Parametri') 
     AND name = @cName 
) 

而且這種雙重嵌套遊標一點似乎非常低效,比需要更大量的代碼來實現我認爲你正在試圖做的。如果是這樣的東西,而不是:

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; 
+0

好吧,好像我現在有一些錯誤...我會盡力使這個作品。謝謝您的幫助 – Stojdza 2013-04-06 19:17:30