2015-04-21 5 views
0

Привет, ребята, я создаю процедуру магазина, но я получаю эту ошибку: 105 Unclosed quotation mark after the character string 'Guadalajara,Jal'., и я просмотрел несколько веб-сайтов, к сожалению, я нашел ответ. Вот мой код:Ошибка Transact SQL Server 105

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 ['[email protected]+'].'+'['[email protected]+'].[dbo].[Reservaciones] values'+ 
       '('''[email protected]+''','''[email protected]+''','''[email protected]+''','''[email protected]+''','''[email protected]+''','''[email protected]+''','[email protected]+','''[email protected]+''',GETDATE())' 
       EXEC(@cmd) 

       SET @cmd='Update ['[email protected]+'].['[email protected]+'].[dbo].[Vuelos] Set Dis-='[email protected]+' where Vuelo='[email protected]; 
       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 однако у меня есть debug и в этой переменной, и она завершена, я проверил и да, что переменная имеет достаточно места для текста.

Я ценю любую помощь, которую вы, ребята, можете мне предоставить.

ответ

1

Это потому, что вы используете неправильный тип данных для @cmd. sysname datatype имеет ограниченную длину 128 символов Unicode.

Я бы также посоветовал вам избегать динамического sql, так как он обычно очень уязвим для атак SQL Injection.

+0

Спасибо, что вы сработали, изменив другой тип данных. Итак, какова будет ваша рекомендация вместо использования динамического sql ?. Я решил использовать его с тех пор, как использовал связанные серверы. – Gustavo

+0

Сколько у вас связанных серверов? –

+0

На данный момент у меня 4, но в ближайшем будущем планируется добавить еще 5. – Gustavo