Перенос текста в SQL - PullRequest
       1

Перенос текста в SQL

0 голосов
/ 08 августа 2011

Привет и добрый день. У меня проблема с системой, которую я поддерживаю. Я могу построить "Макросы", которые могут тянуть представления SQL в документ. Проблема в том, что столбцы для этих представлений не переносятся в документе. Если в определенной строке слишком много текста, другие столбцы будут вытеснены из строки. Чтобы решить эту проблему, я пытаюсь создать функцию для использования с моим представлением, которая будет выполнять грубую форсировку переноса, просматривая каждую строку и создавая дополнительную строку для хранения текста для определенных столбцов, в которых был достигнут лимит текста. У меня есть кое-что, что работает, но иногда это ужасно медленно. У кого-нибудь есть идеи, как мне это оптимизировать?

(  

)  
RETURNS @medlist2 TABLE (uniq_id UNIQUEIDENTIFIER, enterprise_id CHAR(5), practice_id CHAR (4), person_id UNIQUEIDENTIFIER, 
enc_id UNIQUEIDENTIFIER, medication_name VARCHAR (70), sig_desc VARCHAR (512), start_date VARCHAR(10), row_num INT)

AS  
  BEGIN  

DECLARE @medlist TABLE (uniq_id UNIQUEIDENTIFIER, enterprise_id CHAR (5), practice_id CHAR (4), person_id UNIQUEIDENTIFIER, 
enc_id UNIQUEIDENTIFIER, medication_name VARCHAR (70), sig_desc VARCHAR (512), start_date DATETIME, processed INT)
DECLARE @medicationName VARCHAR (70)
DECLARE @sigDesc VARCHAR (512)
DECLARE @startDate VARCHAR (10)
DECLARE @uniqID UNIQUEIDENTIFIER
DECLARE @enterpriseID CHAR (5)
DECLARE @practiceID CHAR (4)
DECLARE @personID UNIQUEIDENTIFIER
DECLARE @encID UNIQUEIDENTIFIER
DECLARE @RowNum INT
DECLARE @RowCount INT

INSERT INTO @medlist (uniq_id, enterprise_id, practice_id, person_id, 
enc_id, medication_name, sig_desc, start_date, processed)
SELECT uniq_id, enterprise_id, practice_id, person_id, 
enc_id, medication_name, sig_desc, start_date, 0
FROM med_table
WHERE person_id IN (select distinct person_id from active_users where create_timestamp > GETDATE()-.2)
AND date_stopped = ''
ORDER BY medication_name

SET @RowCount = (SELECT COUNT(*) FROM @medlist WHERE processed = 0)
SET @RowNum = 0

WHILE @RowCount > 0
BEGIN

    SET @RowNum = @RowNum + 1

    SELECT TOP(1) @uniqid = uniq_id, @enterpriseID = enterprise_id, @practiceID = practice_id, 
    @personID = person_id, @encID = enc_id, @medicationName = '- ' +medication_name, @sigDesc = sig_desc, 
    @startDate = CONVERT(VARCHAR(10), start_date, 101)
    FROM @medlist
    WHERE processed = 0

    INSERT INTO @medlist2(uniq_id, enterprise_id, practice_id, person_id, 
    enc_id, start_date, row_num, medication_name, sig_desc)
    SELECT @uniqID, @enterpriseID, @practiceID, @personID, @encID, @startDate, @RowNum,
    (CASE WHEN DATALENGTH(@medicationName) > 28 THEN LEFT(@medicationNAME, 28) + '-' ELSE @medicationName END), 
    (CASE WHEN DATALENGTH(@sigDesc) > 41 THEN LEFT(@sigDesc, 41) + '-' ELSE @sigDesc END)

        WHILE DATALENGTH(@sigDesc) > 42 OR DATALENGTH(@medicationName) > 29
        BEGIN

        SET @medicationName = substring(@medicationName, 29,DATALENGTH(@medicationName))
        SET @sigDesc = substring(@sigDesc, 42,DATALENGTH(@sigDesc))
        SET @RowNum = @RowNum + 1

        INSERT INTO @medlist2 (uniq_id, enterprise_id, practice_id, person_id, 
        enc_id, medication_name, sig_desc, row_num)
        SELECT @uniqID, @enterpriseID, @practiceID, @personID, @encID, LEFT(@medicationNAME, 28), LEFT(@sigDesc, 41), @RowNum

        IF DATALENGTH(@sigDesc) < 42 OR DATALENGTH(@medicationName) > 29
            BREAK
        ELSE
            CONTINUE
        END

    UPDATE @medlist
    SET processed = 1
    WHERE uniq_id = @uniqID

    SET @RowCount = (SELECT COUNT(*) FROM @medlist WHERE processed = 0)

IF @RowCount = 0
    BREAK
ELSE
    CONTINUE
END 
    RETURN  
END

1 Ответ

5 голосов
/ 08 августа 2011

Не делайте этого в базе данных.Сделайте это на уровне приложения!

Что-то столь же тривиальное, как перенос текста, очень дорого, когда SQL-сервер делает это построчно, но должно выполняться очень быстро в любом приложенииотображает ваши результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...