Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 动态SQL显示成功,但不更新行_Sql Server_Stored Procedures_Sql Server 2008 R2_Dynamicquery - Fatal编程技术网

Sql server 动态SQL显示成功,但不更新行

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

我不熟悉SQL Server和存储过程,也就是说,我正在使用SQL Server 2008 R2尝试进行动态查询,允许我传入表名和一些参数来更新某些行

存储过程运行并表示已成功完成,但从未更新行。如果我分解查询并单独运行它们,它们就可以工作,但一起运行什么也没有

我尝试使用print和select语句来显示我的查询和进度,但没有打印出来

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,等等。。。我应该换一种方式吗?