Попытка написать комманду UPDATE в хранимой процедуре с помощью динамического SQL - PullRequest
0 голосов
/ 02 августа 2011

Вот, второй пост, первый не пошел хорошо ....

Я звоню SP из Gridview в ASP. Я передаю имя таблицы в качестве переменной вместе с некоторыми другими переменными. Мне нужно ОБНОВИТЬ мою исходную таблицу, к которой присоединяется Gridview, а также создать Datalist, я использовал Fetch и получил его в порядке. Просмотрите эти записи и вставьте данные в третью таблицу. Мне сказали (в первом посте), что мне нужно сначала создать строку SQL, а затем выполнить ее. когда я так пишу, вторая часть вставки не работает.

Вот код в разрезанной форме из-за попыток найти удачную структуру ....

    @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

Ответы [ 2 ]

1 голос
/ 02 августа 2011

Кажется, что ваша процедура может быть переписана следующим образом:

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 голосов
/ 02 августа 2011

Я не совсем понимаю вашу проблему, но я вижу одну вещь, которая явно неправильна: в 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 
...