你好,下午好。我正面临着我支持的系统的问题。我能够构建“宏”,它可以将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
答案 0 :(得分:5)
请勿在数据库中执行此操作。在您的应用层执行此操作!
当SQL服务器在逐行的基础上执行时,包装文本非常简单,但在任何显示结果的应用程序中应该非常快速。