Проблема с переносами в запросах MSSQL

Для создания заявки в задаче написал процедуру

ALTER PROCEDURE [dbo].[crm_otp_mailrequest]
-- Add the parameters for the stored procedure here

        @TaskID uniqueidentifier,
        @OwnerID uniqueidentifier
       
AS
BEGIN
     DECLARE @MailRequestID uniqueidentifier;
     DECLARE @MailRequestInTaskID uniqueidentifier;

     SET @MailRequestID = NEWID();
         SELECT TOP 1 @MailRequestInTaskID=TaskID FROM tbl_MailRequestInTask WHERE TaskID=@TaskID;
         
         IF @MailRequestInTaskID is null  
     INSERT INTO [tbl_MailRequest]
            ([ID], [CreatedOn], [ModifiedOn], [CreatedByID], [ModifiedByID],[Ext],[Subject],[ReplyTo],[ToSend],[MailDataReply])
     
    (SELECT
        @MailRequestID,
    GetDate(),
    GetDate(),
    @OwnerID,
    @OwnerID,
    'mht',
    ts.title + ' ' + cc.Name,
    '"oazgolich@telecom.by";',
    1,
    'Автор: '+'Олег'+CHAR(13)+
    'Физ.Лицо: '+'Зголич Олег Александрович'+CHAR(13)+
    'Дебитор: '+'1859860'+CHAR(13)+
    'Лицевой счет: '+'5098692'+CHAR(13)+
    'Биллинг ID: '+'12345'+CHAR(13)+
    'Номер задачи в Terrasoft: '+'З12434'+CHAR(13)+
    'Описание: '+ convert(varchar(250),ts.DetailedResult)

        FROM tbl_Task ts
        LEFT JOIN dbo.tbl_Contact cc ON ts.ContactID = cc.ID
        WHERE ts.id = @TaskID
        )
   
         IF @MailRequestInTaskID is null  
     INSERT INTO [tbl_MailRequestInTask]
     ([ID], [TaskID], [MailRequestID])  
     VALUES
     (NEWID(),
      @TaskID,
      @MailRequestID)
END

Тело заявки должно формироваться как указано выше. Проблема заключается в том, что при просмотре результата через EMS все данные отображаются как надо, с переносами char(13).
В террасофте же тело заявки заполняется одной строкой, переносов нету. Хотелось бы узнать как можно победить данную проблему

Нравится

22 комментария

Попробуйте добавить после char(13) символ перевода строки char(10). Должно помочь.

Написал char(13)+char(10) не помогло

Попробуйте вместо char(13)+char(10) добавить строку '\r\n'

Здравствуйте Олег
Пример

 update tbl_Task 
 set Title = 'Текст раз' + NCHAR(13)+NCHAR(10) + 'Текст два'
 where ID = '8DA65EE6-D25F-4594-8DCE-01F9128D21CE'

Проверяем

 select * from tbl_Task 
 where ID = '8DA65EE6-D25F-4594-8DCE-01F9128D21CE'

NCHAR(13) - символ возрата каретки
NCHAR(10) - переход на новую строку

В INSERT INTO почему-то не хочет nchar юзаться

 Insert into tbl_Task(ID,Title)
 values
 (NEWID(),'Текст три' + NCHAR(13)+NCHAR(10) + 'Текст четыре')

Проверяем

select * from tbl_Task where Title like '%Текст%'

Проверял на Microsoft SQL Server Management Studio 10.50.1600.1 (Microsoft SQL Server 2008 R2)

Поле типа MemoDataControl, может в этом какая проблема? Проверил на теме, переносы действительно отлично работают

Поле edtTitle в карточке редактирования задачи wnd_TaskEdit также иммет тип MemoDataControl. Что вы имеете в виду ?

Да. Точно, типы одинаковые. Тогда не пойму почему не переносит. Хотя в других полях все ок.

Олег, насколько я помню у этого контрола есть свойство, которое отвечает за перенос строк.

Наверное WordWrap появился в более новых версиях. В 3.0.4 нету.

Что то я перепутал, я данные в rdcMailBody окна wnd_MailRequest, таблицы tbl_mailreply пытаюсь добавить. Тип поля RichDataControl

Олег, там другой символ переноса. Было как-то на форуме, на 100% не уверен, но что-то вроде /par.
Можете в пустом поле сделать перевод строки, сохранить и посмотреть, что будет в БД через запрос:

select cast(substring([Field1], 1, 4000) as varchar(4000)) from [Table1]

Нашел в темах \par, но почему-то при подстановке в sql процедуру данный оператор выводится как символы

Олег, не совсем понятно, куда вы вставили , и что не так выводится.

Я как понял \par надо подставлять в скрипт террасофта. А мне надо перенос делать в процедуре. В общем то реши проблему, сохраняю не в 'mht' в базу, а в 'txt'. Но это обходной путь и не совсем верно так решать проблему.

Текст "\par" такой же как и обычный текст. Вставляйте в процедуру и будет вам счастье :)

Вот я об этом и говорю=) Если я ,например, сделаю так :

ALTER PROCEDURE [dbo].[crm_otp_mailrequest] 
-- Add the parameters for the stored procedure here
 
        @TaskID uniqueidentifier,
        @OwnerID uniqueidentifier
 
AS
BEGIN
     DECLARE @MailRequestID uniqueidentifier;
     DECLARE @MailRequestInTaskID uniqueidentifier;
 
     SET @MailRequestID = NEWID();
         SELECT TOP 1 @MailRequestInTaskID=TaskID FROM tbl_MailRequestInTask WHERE TaskID=@TaskID;
 
         IF @MailRequestInTaskID is null  
     INSERT INTO [tbl_MailRequest]
            ([ID], [CreatedOn], [ModifiedOn], [CreatedByID], [ModifiedByID],[Ext],[Subject],[ReplyTo],[ToSend],[MailDataReply])
 
    (SELECT
        @MailRequestID,
    GetDate(),
    GetDate(),
    @OwnerID,
    @OwnerID,
    'mht',
    ts.title + ' ' + cc.Name,
    '"oazgolich@telecom.by"<oazgolich@telecom.by>;',
    1,
    'Автор: '+'Олег'+"\par"+
    'Физ.Лицо: '+'Зголич Олег Александрович'+"\par"+
    'Дебитор: '+'1859860'+"\par"+
    'Лицевой счет: '+'5098692'+"\par"+
    'Биллинг ID: '+'12345'+"\par"+
    'Номер задачи в Terrasoft: '+'З12434'+"\par"+
    'Описание: '+ convert(varchar(250),ts.DetailedResult)
 
        FROM tbl_Task ts 
        LEFT JOIN dbo.tbl_Contact cc ON ts.ContactID = cc.ID
        WHERE ts.id = @TaskID
        )
 
         IF @MailRequestInTaskID is null   
     INSERT INTO [tbl_MailRequestInTask]
     ([ID], [TaskID], [MailRequestID])  
     VALUES
     (NEWID(),
      @TaskID,
      @MailRequestID)
END

то данный оператор отображается символами "\par" вместо переноса

Олег, попробуйте отделить пробелом или стандартным переносом строки. Вы не пробовали как я писал?
Вставте в чистое поле в террасофте текст, потом с новой строки - другой и посмотрите что на самом деле записалось в БД.

Пробовал таким образом. Дело в том, что в бд записывается все с переносами.

Значит это не RichDataControl, если бы был rich, то должно записываться в формате rtf

Еще как вариант попробуйте взять эти переносы строк. вычислить в sql их коды сможете через ascii(substring(field1, start, 1))
где укажите корректное значение start

Показать все комментарии