我试图打破所有使用stuff函数进行数据库化的规则。为了科学,我想把每一个合适的行都划成一排,你知道吗?
问题是,我每次都要写一个新函数。它们看起来是这样的:
ALTER function [dbo].[stuffMeds](@VisitID varchar(55))
returns varchar(max)
as
begin
declare @string varchar(max)
set @string = (select stuff( (
select distinct top 500 ', ' + DataItemID from
EmrAcctPha_Medication med
where
VisitID = @VisitID
order by ', ' + DataItemID desc
for xml path ('')),1,2,'')
)
return @string
end在如下查询中使用:
select AdmitDateTime, RoomID, dbo.stuffMeds(VisitID)
from AbstractData它变成了这样的列表:
硫酸沙丁醇
苯磺酸氨氯地平
阿司匹林
甲磺酸苄托品
双康德
环丙沙星
胶原酶
二丙戊酸钠
..。
变成这样的字符串:
二丙戊酸钠,胶原酶,环丙沙星,双黄醇,甲磺酸苄托品,阿司匹林,苯磺酸氨氯地平,硫酸阿尔布特罗
我可以将它写成一个动态存储过程,但是您不能从一个函数调用sp_executesql (或者至少我不知道如何调用)。
问如何将此函数编写成可用于任何表的方式?
发布于 2018-06-01 19:21:23
在另一个答案中,@SQLRaptor提出了使用STRING_AGG的建议。与此相结合,以下几点似乎可以发挥作用:
SELECT AdmitDateTime, RoomID, med.stuffMeds
FROM AbstractData AD
OUTER APPLY (
SELECT STRING_AGG(DataItemID, ', ') WITHIN GROUP (ORDER BY DataItemID ASC) stuffMeds
FROM EmrAcctPha_Medication med
WHERE AD.VisitID = med.VisitID
) med发布于 2018-06-01 14:54:16
在Server中有一个名为STRING_AGG的内置函数。看看文档。
发布于 2018-06-01 16:02:26
如果我们违反了规则,为science...how做这件事。
创建一个视图,将您感兴趣的所有表中的所需列合并在一起,并创建一个列,该列包含源表名称,即EmrAcctPha_Medication。
然后将表名作为变量传递给函数,并对“tablename & @visited”进行筛选。
ALTER function [dbo].[stuffMeds](@VisitID varchar(55),@tablename varchar(255))
returns varchar(max)
as
begin
declare @string varchar(max)
set @string = (select stuff( (
select distinct top 500 ', ' + DataItemID from
dbo.myreallybigview med
where
VisitID = @VisitID
AND
TableName = @tablename
order by ', ' + DataItemID desc
for xml path ('')),1,2,'')
)
return @string
endhttps://dba.stackexchange.com/questions/208489
复制相似问题