簡體   English   中英

SQL:動態 SQL 問題

[英]SQL: Dynamic SQL issue

我不確定為什么這不起作用。 如果成功保存,我將它設置為返回結果 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 

在這里,您只需將難度轉換為 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.

使用參數!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM