Sql 您可以加入存储过程吗?

Sql 您可以加入存储过程吗?,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有一堆带有语句的: ;with OneAccession as ( select client_id,COUNT(patient_id) PatientCount from ( select client_id,patient_id from F_ACCESSION_DAILY group by CLIENT_ID,PATIENT_ID having COUNT(AC

我有一堆带有语句的

;with OneAccession as (
        select client_id,COUNT(patient_id) PatientCount from
        (
            select client_id,patient_id
            from F_ACCESSION_DAILY
            group by CLIENT_ID,PATIENT_ID
            having COUNT(ACCESSION_ID)=1
        ) a
        group by CLIENT_ID
    )
    ,

    TwoAccessions as (
    select client_id,COUNT(patient_id) PatientCount from
        (
            select client_id,patient_id
            from F_ACCESSION_DAILY
            group by CLIENT_ID,PATIENT_ID
            having COUNT(ACCESSION_ID)=2
        ) a
    group by client_id
    )

    ,

    ThreeAccessions as (
    select client_id,COUNT(patient_id) PatientCount from
    (
        select client_id,patient_id
        from F_ACCESSION_DAILY
        group by CLIENT_ID,PATIENT_ID
        having COUNT(ACCESSION_ID)=3
    ) a
    group by client_id
    )
etc
我加入这些关于

select * from myTable
join OneAccession
on...
join TwoACcessions
on...
join ThreeAccessions
我可以创建一个存储的过程,而不是让所有这些
都带有
语句吗?我只需传递
having count(accession_id)=**myParam**
的值,然后执行以下操作:

select * from myTable
join storedproc(1)
on...
join storedproc(2)
on...
etc...
加入存储过程是否存在问题?我的方法是否可行?

请查看。使用
APPLY
with似乎是使用
APPLY
的经典示例,我认为这正是您想要的

通过一个示例(使用AdventureWorks)来了解这一点:

看一看。使用
APPLY
with似乎是使用
APPLY
的经典示例,我认为这正是您想要的

通过一个示例(使用AdventureWorks)来了解这一点:


不…您可以使用表函数来代替。

不…您可以使用表函数代替。

您可以联接存储过程,但可以联接函数和视图。请注意,视图不能获取参数,并且函数的性能可能不如CTE

另外,看看您的查询,看起来您应该查看新的窗口函数以及类似的内容

;with cte as (
    select *, count(*) over (partition by client_id, patient_id) patientcount
    from f_accession_daily
)
select * from myTable
     inner join cte on ... and patientCount=1

可能对您试图实现的目标有所帮助。

您可以不加入存储过程,但可以同时加入函数和视图。请注意,视图不能获取参数,并且函数的性能可能不如CTE

另外,看看您的查询,看起来您应该查看新的窗口函数以及类似的内容

;with cte as (
    select *, count(*) over (partition by client_id, patient_id) patientcount
    from f_accession_daily
)
select * from myTable
     inner join cte on ... and patientCount=1

可能有助于实现您的目标。

您对此解决方案有何想法?我认为正确的问题应该是
“TVF和存储过程之间的区别是什么”
,这里回答了这个问题:您对这个解决方案有什么想法?我认为正确的问题应该是“TVF和存储过程之间的差异是什么”
,这里回答了这个问题:非常感谢您能告诉我select,count()…如何等同于count…?添加了一些显示相似性的代码。正如其他人所指出的,TVF就是您所描述的,但是考虑到您的代码,我会花一些时间来看看是否有不同的方法。在不了解您的模式和数据的情况下,我当然不能肯定,但我认为您的方法不太可能是您试图解决的任何问题的最佳解决方案。对不起,我将加入什么,我将计算什么?每行的计数是具有患者和客户id的行数,不同之处在于,您使用的不是group by,而是partition by,并且您可以在表中包含任何或所有其他列,而无需返回并进行自联接。非常感谢您能告诉我select、count()…如何等效于count…?添加了一些显示相似性的代码。正如其他人所指出的,TVF就是您所描述的,但是考虑到您的代码,我会花一些时间来看看是否有不同的方法。在不了解您的模式和数据的情况下,我当然不能肯定,但我认为您的方法不太可能是您试图解决的任何问题的最佳解决方案。对不起,我将加入什么,我将计算什么?每行的计数是具有患者和客户id的行数,不同之处在于,您使用的不是group by,而是partition by,您可以在表中包含任何或所有其他列,而无需返回并进行自联接。请参阅本文:。创建table函数后,您可以像使用联接/应用程序的表一样使用它。请参阅以下文章:。一旦创建了表函数,您就可以像使用联接/应用程序的表一样使用它。