尝试使用动态SQL在存储过程中编写UPDATE comm

时间:2011-08-02 11:58:28

标签: stored-procedures

在这里,第二篇文章,首先没有顺利....

我在ASP中使用Gridview调用SP。我传入一个表名作为变量以及一些其他变量。我需要更新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 个答案:

答案 0 :(得分: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

但是,我不确定为什么你需要原始版本的游标,或者你的意思是“不起作用”。你能解释一下吗?

答案 1 :(得分: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