在这里,第二篇文章,首先没有顺利....
我在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
答案 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