2011-08-02 19 views
0

這裏去,第二次後,第一次沒有去很好....嘗試寫一個UPDATE通訊在存儲過程中使用動態SQL

我打電話從ASP一個GridView的SP。我將表名作爲變量和其他一些變量一起傳遞。我需要更新我的原始表格,Gridview附加到,但也建立一個Datalist,我使用了一個Fetch,並得到它的工作正常。循環訪問這些記錄並將數據插入第三個表中。我被告知(在第一篇文章中)我需要先構建SQL字符串然後執行它。當我這樣寫時,插入的第二部分不起作用。

這裏是因爲努力尋找succesfull結構及其瓜分形式的代碼....

@currTable varchar(100), 
    @ID int, 
    @short_Text varchar(250), 
    @brief_Descrip varchar(250) = Null, 
    @needsTranslation varchar(10) = Null, 
    @prev_LangString varchar(250) = Null, 
    @lang_String varchar(250) = Null, 
    @original_lang_String varchar(250) = Null, 
    @StringID_from_Master varchar(250),  
    @GUID varchar(250) = Null 

/* 

*/ 

AS   
SET NOCOUNT ON; 

DECLARE @userTable AS VARCHAR(200); 
SET @userTable = @currTable 
DECLARE @submitDate1 DATETIME; 
SET @submitDate1 = GETDATE() 



SET @prev_LangString = @original_lang_String 
SET @needsTranslation = 'false' 

DECLARE @sql varchar(max) 
    -- Establish update to the language tabel of user and prepare to search DB for all strings that will need to be updated. 
BEGIN 

-- DECLARE @sql nvarchar(4000) 
SELECT @sql = ' UPDATE ' + @currTable + 
       ' SET [lang_String] = ' + @lang_String + 
       ' WHERE (ID = ' + @ID + ' '; 

EXEC sp_executesql @sql, N'@ID nvarchar(10)', @ID     


     -- UPDATE  @userTable 
     -- SET    [lang_String] = @lang_String, [date_Changed] = @submitDate1, [prev_LangString] = @prev_LangString, [needsTranslation] = @needsTranslation, [brief_Descrip] = @brief_Descrip 
     -- WHERE  (ID = @ID) 

END 

BEGIN    
    DECLARE usedIN_DBScursor CURSOR 
    FOR 
    SELECT  tblUniquetblStringsMaster_ID, Database_Name, dbKeyID_ofStringName 
    FROM   tblDBUsage 
    WHERE  (tblUniquetblStringsMaster_ID = @StringID_from_Master); 


       -- Declare the variables to store the values returned by FETCH. 
    DECLARE @tblUniquetblStringsMaster_ID AS INT; 
    DECLARE @dbKEYID as INT; 
    DECLARE @dbName as varchar(100); 

    OPEN usedIN_DBScursor; 

    -- Perform the first fetch and store the values in variables. 
    -- Note: The variables are in the same order as the columns 
    -- in the SELECT statement. 

    FETCH NEXT FROM usedIN_DBScursor 
    INTO @tblUniquetblStringsMaster_ID, @dbName, @dbKEYID; 

    -- Check @@FETCH_STATUS to see if there are any more rows to fetch. 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    -- Update pending strings table with translation.   
     BEGIN 
      INSERT INTO tblPendingDBUpdates 
            (stringMasterID, databaseName, databaseStringID, englishText, foreignLangText, submitDate, GUID) 
      VALUES  (@StringID_from_Master, @dbName, @dbKEYID, @short_Text, @lang_String, @submitDate1, @GUID);          
     END 
--  SET @sql = '' 
    -- This is executed as long as the previous fetch succeeds. 
     FETCH NEXT FROM usedIN_DBScursor 
     INTO @tblUniquetblStringsMaster_ID, @dbName, @dbKEYID; 
    END 

    CLOSE usedIN_DBScursor; 
    DEALLOCATE usedIN_DBScursor;  

END 



RETURN 
+0

我看到這裏不需要遊標,難道你不能只在一個INSERT-SELECT命令中插入所有的行?請參閱:http://msdn.microsoft.com/en-us/library/ms188263.aspx –

+0

我必須循環訪問從tblDBUsage返回的大約1到300條記錄,這些記錄會附加到傳遞到SP中的一些變量,然後更新INSERT中的第三個表。我會立即查看您的鏈接。 – htm11h

+0

這個網站還是新手,請原諒我的新手錯誤。 – htm11h

回答

1

看來,你的程序可以重新如下所示:

ALTER PROCEDURE dbo.procedure_name 
    @currTable varchar(100), 
    @ID int, 
    @short_Text varchar(250), 
    @brief_Descrip varchar(250) = Null, 
    @needsTranslation varchar(10) = Null, 
    @prev_LangString varchar(250) = Null, 
    @lang_String varchar(250) = Null, 
    @original_lang_String varchar(250) = Null, 
    @StringID_from_Master varchar(250),  
    @GUID varchar(250) = Null 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @sql NVARCHAR(MAX); 

    SELECT @sql = N' UPDATE ' + QUOTENAME(@currTable) + ' SET [lang_String] = ''' 
     + REPLACE(@lang_String,'''','''''') + ''' WHERE ID = ' + RTRIM(@ID) + ';'; 

    EXEC sp_executesql @sql; 

    INSERT tblPendingDBUpdates 
    (
     stringMasterID, 
     databaseName, 
     databaseStringID, 
     englishText, 
     foreignLangText, 
     submitDate, 
     [GUID] 
    ) 
    SELECT 
     @StringID_from_Master, 
     Database_Name, 
     dbKeyID_ofStringName, 
     @short_Text, 
     @lang_String, 
     @submitDate1, 
     @GUID 
    FROM 
     tblDBUsage 
     WHERE tblUniquetblStringsMaster_ID = @StringID_from_Master; 
END 
GO 

然而,我不確定爲什麼你需要一個遊標在你的原始版本,或者你的意思是「不起作用」。你可以解釋嗎?

+0

+1,刪除那個討厭的光標! –

+0

@KM謝謝,我也有很多關於命名約定的建議,但不想淹沒這個可憐的傢伙。 –

+0

好吧,我嘗試了這段代碼,並得到一個錯誤... [無效的列名'測試']這是我輸入到lang_String中的值,這是調用此SP的gridview的編輯字段。 – htm11h

0

我不太明白你的問題,但我看到的一兩件事是明顯的錯誤:在SQL中,你正在構建一個字符串文字缺少引號,並且有一個缺少的括號。您正在生成的SQL是這樣的:

UPDATE table_name SET [lang_String] = lang_string WHERE (ID = 123 

所以它應該是:

DECLARE @sql nvarchar(4000) 
SELECT @sql = 'UPDATE ' + @currTable + ' SET [lang_String] = ''' + @lang_String + ''' WHERE ID = ' + @ID 

產生這個SQL:

UPDATE table_name SET [lang_String] = 'lang_string' WHERE ID = 123