【问题标题】:SQL: Dynamic SQL issueSQL:动态 SQL 问题
【发布时间】:2020-01-23 03:15:39
【问题描述】:

我不确定为什么这不起作用。如果成功保存,我将其设置为返回 1 的结果,但我一直得到 0。这是有效的,但我最近增加了查询的难度。现在它不工作了:

SQL 查询:

DECLARE
    @Email AS NVARCHAR(500) = 'uokgames@gmail.com',
    @Update AS NVARCHAR(MAX) = 'SET Tile_332 = 1,Tile_216 = 1,Tile_296 = 1,Tile_303 = 1,Tile_313 = 1,Tile_274 = 1,Tile_261 = 1,Tile_311 = 1,Tile_320 = 1,Tile_204 = 1,Tile_304 = 1,Tile_187 = 1,Tile_291 = 1',
    @Board AS NVARCHAR(100) = 'Templo_Mayor',
    @Difficulty AS INT = 0
--AS
BEGIN
    DECLARE @sql AS NVARCHAR(MAX),
            @Response AS BIT  = 0

    BEGIN TRY
        SET @sql = 'UPDATE [dbo].[Game_Board] ' +  @Update + ' WHERE [Email] =''' + @Email + ''' AND [Board_Name] = ''' + @Board + ''' AND [Difficulty] = ' + @Difficulty
        EXECUTE sp_executesql @sql  

        SET @Response = 1;
    END TRY
    BEGIN CATCH
        SET @Response = 0;
    END CATCH

    SELECT @Response
END 

【问题讨论】:

    标签: sql .net


    【解决方案1】:

    在这里你只需要将难度转换为 varchar(1) 就可以了。

    DECLARE
    @Email AS NVARCHAR(500) = 'uokgames@gmail.com',
    @Update AS NVARCHAR(MAX) = 'SET Tile_332 = 1,Tile_216 = 1,Tile_296 = 1,Tile_303 = 1,Tile_313 = 1,Tile_274 = 1,Tile_261 = 1,Tile_311 = 1,Tile_320 = 1,Tile_204 = 1,Tile_304 = 1,Tile_187 = 1,Tile_291 = 1',
    @Board AS NVARCHAR(100) = 'Templo_Mayor',
    @Difficulty AS varchar(1) = '0'
    --AS
    BEGIN
        DECLARE @sql AS NVARCHAR(MAX),
                @Response AS BIT  = 0
    
        BEGIN TRY
            SET @sql = 'UPDATE [dbo].[Game_Board] ' +  @Update + ' WHERE [Email] =''' + @Email + ''' AND [Board_Name] = ''' + @Board + ''' AND [Difficulty] = ' + @Difficulty
            EXECUTE sp_executesql @sql  
    
            SET @Response = 1;
        END TRY
        BEGIN CATCH
            SET @Response = 0;
        END CATCH
    
        SELECT @Response
    END 
    

    你需要删除 try catch 的东西,这样你才会得到真正的错误:

    Msg 245, Level 16, State 1, Line 12
    Conversion failed when converting the nvarchar value 'UPDATE [dbo].[Game_Board] SET Tile_332 = 1,Tile_216 = 1,Tile_296 = 1,Tile_303 = 1,Tile_313 = 1,Tile_274 = 1,Tile_261 = 1,Tile_311 = 1,Tile_320 = 1,Tile_204 = 1,Tile_304 = 1,Tile_187 = 1,Tile_291 = 1 WHERE [Email] ='uokgames@gmail.com' AND [Board_Name] = 'Templo_Mayor' AND [Difficulty] = ' to data type int.
    

    【讨论】:

      【解决方案2】:

      使用参数!

      BEGIN TRY
          SET @sql = 'UPDATE [dbo].[Game_Board] ' +  @Update + ' WHERE [Email] = @Email AND [Board_Name] = @Board AND [Difficulty] = @Difficulty';
      
          EXECUTE sp_executesql @sql,
                  N'@Email NVARCHAR(500), @Board NVARCHAR(100), @Difficulty INT,
                  @Email=@Email, @Board=@Board, @Difficulty=@Difficulty  
      
          SET @Response = 1;
      END TRY
      BEGIN CATCH
          SET @Response = 0;
      END CATCH
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        • 2021-10-25
        • 1970-01-01
        • 2014-05-14
        相关资源
        最近更新 更多