【问题标题】:Transact SQL Server Error 105处理 SQL Server 错误 105
【发布时间】:2015-06-28 03:00:30
【问题描述】:

大家好,我正在创建存储过程,但出现此错误: 105 Unclosed quotation mark after the character string 'Guadalajara,Jal'.,我浏览了几个网站,遗憾的是我没有找到答案。 这是我的代码:

    Alter Procedure Insertar
(
    @Vuelos nvarchar(6),
    @Aero nvarchar(20),
    @Sal nvarchar(40),
    @Ori varchar(50),
    @Des varchar(50),
    @Lle nvarchar(40),
    @Per nvarchar(1),
    @Nom nvarchar(25),
    @Nodo nvarchar(13)
)
AS
    BEGIN
        Set XACT_ABORT ON
        Begin DISTRIBUTED TRANSACTION
            BEGIN TRY
                Insert into Reservaciones values
                (
                  @Vuelos,@Aero,@Sal,@Ori,@Des,@Lle,@Per,@Nom,GETDATE()
                )

                DECLARE @cmd as sysname;
                SET @cmd ='Insert into ['+@Nodo+'].'+'['+@Aero+'].[dbo].[Reservaciones] values'+
                '('''+@Vuelos+''','''+@Aero+''','''+@Sal+''','''+@Ori+''','''+@Des+''','''+@Lle+''','+@Per+','''+@Nom+''',GETDATE())'
                EXEC(@cmd)

                SET @cmd='Update ['+@Nodo+'].['+@Aero+'].[dbo].[Vuelos] Set Dis-='+@Per+' where Vuelo='+@Vuelos;
                EXEC(@cmd)
            END TRY
            BEGIN CATCH
                PRINT ERROR_NUMBER()
                PRINT ERROR_MESSAGE()
                ROLLBACK
            END CATCH
            IF @@TRANCOUNT > 0
                commit
    END

这就是我在存储过程中输入的内容

EXEC Insertar 'AM 500','Mexicana','2015-05-13 19:00:00.0','Guadalajara,Jalisco,Mexico','San Diego,California,Estados Unidos','2015-05-13 21:21:00.0',3,'gus','Gustavo\Nodo1';

更具体地说,问题是 sql 正在削减变量 @Ori 中的内容的一半,但是我已经调试并且在该变量中并且它是完整的,我已经检查过,是的,该变量确实有足够的空间用于文本。

感谢你们为我提供的任何帮助。

【问题讨论】:

    标签: sql-server transactions distributed-transactions


    【解决方案1】:

    这是因为您为 @cmd 使用了错误的数据类型。 sysname 数据类型的长度限制为 128 个 Unicode 字符。

    我还建议您尽量避免使用动态 sql,因为它通常很容易受到 SQL Injection 攻击。

    【讨论】:

    • 感谢您更改为不同的数据类型。好的,那么您的建议是什么而不是使用动态 sql?我决定使用那时,因为我使用的是链接服务器。
    • 目前我有 4 个,但计划在不久的将来再添加 5 个。
    • 在每个数据库上都有几个包含 Reservaciones 和 Vuelos 表的数据库,还是只有一个?
    • 感谢您的文章,我会看看它。是的,大多数数据库都会有两个表。这将是唯一相互通信的,数据库确实有其他表,但不需要从其他地方访问它们。
    猜你喜欢
    • 2013-10-19
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2014-05-08
    • 2019-12-27
    • 1970-01-01
    相关资源
    最近更新 更多