SQL文本包装

时间:2011-08-08 18:36:58

标签: sql-server sql-server-2005 tsql

你好,下午好。我正面临着我支持的系统的问题。我能够构建“宏”,它可以将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 个答案:

答案 0 :(得分:5)

请勿在数据库中执行此操作。在您的应用层执行此操作!

当SQL服务器在逐行的基础上执行时,包装文本非常简单,但在任何显示结果的应用程序中应该非常快速。