Sql server 行存在于单个表中的SQL联接

Sql server 行存在于单个表中的SQL联接,sql-server,Sql Server,我怀疑这个问题以前已经得到了回答,但是我似乎找不到一个与我正在努力实现的目标相匹配的帖子 我有以下存储过程。此过程仅基于第一个IN子句而不是第二个IN子句生成结果 USE [asl] GO /****** Object: StoredProcedure [dbo].[aslGetCommonv1] Script Date: 10/04/2020 3:46:27 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTE

我怀疑这个问题以前已经得到了回答,但是我似乎找不到一个与我正在努力实现的目标相匹配的帖子

我有以下存储过程。此过程仅基于第一个IN子句而不是第二个IN子句生成结果

USE [asl]
GO
/****** Object:  StoredProcedure [dbo].[aslGetCommonv1]    Script Date: 10/04/2020 3:46:27 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[aslGetCommonv1]
    @StartDate varchar(10),
    @EndDate varchar(10),
    @GroupBy varchar(100),
    @Select varchar(100)
AS
    DECLARE @SQL VARCHAR(MAX) 
    SET NOCOUNT ON;
    SET @SQL = @Select + '
    COUNT(*) AS total
    FROM dbo.requests_services rqs
    LEFT JOIN services      svc ON svc.service_id = rqs.service_id
    LEFT JOIN requests         rq ON rq.request_id = rqs.request_id
    LEFT JOIN doctors          do ON do.doctor_id  = rq.doctor_id
    WHERE rqs.service_id IN (1005, 1006, 1007, 1008, 1401, 1402, 1404, 1405, 1407, 1408, 1410, 1501, 1503, 1504, 1505, 1506, 1509, 5101, 5103) OR
    svc.service_abbrev IN (SADREN, SADREN2, SFH28, SLPSAL, TFT, CTA, VITD, U216 OH, U2416 OH, UEMET, CALP, FAEPCR, CDSA1, CDSA2, CDSA3, CDSA3+, CDSA4, CDSA4+, CDSA5, INTPERM, SIBO2, SIBO3, GIEFFCO, GIEFFME, CMAP,
    CMMR, IGA96, IGA96AS, IGG144, IGA144, IGG208, IGA208, IGG+A208, ALC050, ALC100, ALC150, ALC200, ALCPLAT, CYTOK, HIAM, DAO, KRPR, ENEUM, LIPOSCRN, INEUM, ANEUM, ORGANIX, UIODL, MTHFR, OM3INPR,
    ONCOSTAT, ONCONEXT, ONCONPLUS, ONCOTRACE, ONCOTRAIL, ONCOCOUNT, IMMUNOSTAT, NAGALASE, PRIMESPOT, CHEMOSNIP) AND rq.entry_date BETWEEN ' + @StartDate + ' AND ' + @EndDate + '
    GROUP BY ' + @GroupBy + '
    ORDER BY rqs.service_id ASC'

    EXEC(@SQL)
请忽略日期为varchar的事实。现在,我认为第二个IN子句的结果为空的原因是SELECT或JOIN语句中没有引用表dbo.services,我只是不知道如何以正确的方式将其放入其中

service_abbrev列仅存在于单个表dbo.services中。该表中唯一的另一列是service_id字段,如上所述,它是从dbo.requests_services列service_id连接而来的

那么,获取过程中引用的表dbo.services以便从两个in子句返回结果的最佳方法是什么

**编辑** 所以,我需要更改日期的代码,使其看起来像这样?在“+”@StartDate“+”和“+”@EndDate”之间+

字符串SADREN、SADREN2等只有在我重复引用时才被接受——这可能是因为我没有像上面那样引用@Dates吗

另外,下面是我用来测试的查询:

USE asl;

DECLARE @StartDate varchar(10)
SET @StartDate = '2018-02-01'

DECLARE @EndDate varchar(10)
SET @EndDate = '2019-06-20'

DECLARE @GroupBy VARCHAR(100)
SET @GroupBy = 'rqs.service_id,svc.service_abbrev'

DECLARE @Select VARCHAR(100)
SET @Select = 'SELECT rqs.service_id,svc.service_abbrev,'

EXEC dbo.aslGetCommonv1 @StartDate, @EndDate, @GroupBy, @Select

有许多事情是错误的

SADREN、SADREN2、SFH28等为字符串,应为单引号

在“++@StartDate+”和“++@EndDate++之间-需要引用日期

您有一个group by,但group by列不包括在select子句中

“按顺序”列未包含在“选择”列表中,因此无效


除此之外,查询还可以工作。您可以通过生成sql语句来调试它,选择它并将ssms中的查询选项更改为text,然后不执行就运行它。

这些SADREN、SADREN2是什么?它们是值还是列名?您可以首先尝试打印动态sql并单独运行,以检查运行是否正常。SADREN、SADREN2、SFH28、,etc被视为列名,如果它们应被视为字符串,则应将其引用。“dbo.services未在SELECT或JOIN中引用”-是吗?如果我尝试在过程的当前状态下对其运行查询,则会得到无效的SADREN、SADREN2表名,等等。每个值的开头和结尾都有一个引号,我在“SADREN”附近得到了不正确的语法。当试图改变程序时。如果在每个问题的开始和结束处添加两个单引号,则过程或查询中不会出现错误,但不会出现基于非数值的结果。我已编辑该问题以包含更多信息。非常感谢。