Sql server 动态SQL显示成功,但不更新行
我不熟悉SQL Server和存储过程,也就是说,我正在使用SQL Server 2008 R2尝试进行动态查询,允许我传入表名和一些参数来更新某些行 存储过程运行并表示已成功完成,但从未更新行。如果我分解查询并单独运行它们,它们就可以工作,但一起运行什么也没有 我尝试使用print和select语句来显示我的查询和进度,但没有打印出来Sql server 动态SQL显示成功,但不更新行,sql-server,stored-procedures,sql-server-2008-r2,dynamicquery,Sql Server,Stored Procedures,Sql Server 2008 R2,Dynamicquery,我不熟悉SQL Server和存储过程,也就是说,我正在使用SQL Server 2008 R2尝试进行动态查询,允许我传入表名和一些参数来更新某些行 存储过程运行并表示已成功完成,但从未更新行。如果我分解查询并单独运行它们,它们就可以工作,但一起运行什么也没有 我尝试使用print和select语句来显示我的查询和进度,但没有打印出来 ALTER PROCEDURE [dbo].[sp_testing_drew] -- Add the parameters for the stored
ALTER PROCEDURE [dbo].[sp_testing_drew]
-- Add the parameters for the stored procedure here
@Table_Name sysname,
@id int,
@username varchar(25)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @recipeName varchar(25),
@idApp varchar(10),
@DynamicSQL1 nvarchar(4000),
@DynamicSQL2 nvarchar(4000),
@DynamicSQL3 nvarchar(4000),
@DynamicSQL4 nvarchar(4000)
-- Set the recipe name, finding it first by its ID
--SELECT @recipeName = Recipe_Name FROM LC2Recipes WHERE LC2RecipesID = 551;
SET @DynamicSQL1 = N'SELECT '+@recipeName+' = Recipe_Name FROM '+@Table_Name+' WHERE LC2RecipesID = '+CAST(@id AS varchar(10))+';'
EXECUTE sp_executesql @DynamicSQL1
-- Get the ID of the approved recipe
--SET @DynamicSQL2 = N'SELECT TOP 1 ' + @idApp + ' = ' + @Table_Name + 'ID FROM ' + @Table_Name + ' WHERE Recipe_Name = ''' + @recipeName + ''' ORDER BY Major_Revision DESC;'
SET @DynamicSQL2 = N'SELECT TOP 1 '+@idApp+' = LC2RecipesID FROM '+@Table_Name+' WHERE Recipe_Name = '''+@recipeName+''' ORDER BY Major_Revision DESC;'
EXECUTE sp_executesql @DynamicSQL2
-- 4 is Archived, 1 is approved, set the user who approved
--SET @DynamicSQL3 = N'UPDATE ' + @Table_Name + ' SET Status = 4 WHERE Recipe_Name = ''' + @recipeName + '';
SET @DynamicSQL3 = N'UPDATE '+@Table_Name+' SET Status = 4 WHERE Recipe_Name = '''+@recipeName+''';'
EXECUTE sp_executesql @DynamicSQL3
--SET @DynamicSQL4 = N'UPDATE ' + @Table_Name + ' SET Approved_By = ''' + @username + ''', Status = 1 WHERE ' + @Table_Name + 'ID = ' + CAST(@idApp AS varchar(10));
SET @DynamicSQL4 = N'UPDATE '+@Table_Name+' SET Approved_By = '''+@username+''', Status = 1 WHERE '+@Table_Name+'ID = '+@idApp+';'
EXECUTE sp_executesql @DynamicSQL4
END
您需要设置变量
@recipeName
和@idApp
的值。这就是导致问题的原因,只需设置这些变量的值,就可以了,旁注:存储过程不应使用sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp.
并使用其他东西作为前缀,或者根本不使用前缀!另一个注意事项:按照编码,这容易受到sql注入的攻击。在执行这种类型的过程时,应该将对象名称包装在QUOTENAME中。这并不完美,但却是防止注射攻击的一小步。@marc_谢谢,我会记住这一点,现在我只是在本地工作,不是在web应用程序上。@Drewdin:不管什么类型的应用程序-只是不要使用sp\uuz
作为存储过程前缀-永远不要…这里出现问题的原因是动态sql的每次执行都在它自己的范围内运行。因此,您的变量不在范围内。更改代码以选择每个动态sql,您将看到其中一些为NULL,因为您的配方和idApp变量将为NULL。我正在查询中设置变量,选择@recipeName=recipe\u name,等等。。。我应该换一种方式吗?