【发布时间】:2016-05-09 11:08:59
【问题描述】:
我有一个这样的车辆清单:
假设我只想显示带有 ECU TMS1 和 C200 的汽车。我怎么做?
我已经插入了这个函数:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[SplitString]
(@pString NVARCHAR(4000), @pDelimiter NCHAR(1))
RETURNS TABLE WITH SCHEMABINDING AS
RETURN
WITH E1(N) AS (
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
), --10E+1 or 10 rows
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS (--==== This provides the "base" CTE and limits the number of rows right up front
-- for both a performance gain and prevention of accidental "overruns"
SELECT TOP (ISNULL(DATALENGTH(@pString),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
),
cteStart(N1) AS (--==== This returns N+1 (starting position of each "element" just once for each delimiter)
SELECT 1 UNION ALL
SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter
),
cteLen(N1,L1) AS(--==== Return start and length (for use in substring)
SELECT s.N1,
ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,8000)
FROM cteStart s
)
--===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found.
SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
Item = SUBSTRING(@pString, l.N1, l.L1)
FROM cteLen l
WHERE SUBSTRING(@pString, l.N1, l.L1) <> ''
;
GO
并创建了这个存储过程:
Alter Procedure [db_ddladmin].[spGetVehicles]
(
@ECU nvarchar(20),
@Identifiers nvarchar(20)
)
AS
Begin
SELECT *
FROM db_ddladmin.View_VehicleReadouts
WHERE ECU IN (SELECT Item FROM [dbo].[SplitString](@ECU,',') )
AND Identifier IN (SELECT Item FROM [dbo].[SplitString](@Identifiers, ','))
END
我通过这个查询执行这个存储过程:
EXEC [db_ddladmin].[spGetVehicles] @ECU = 'EBS7,ALM1', @Identifiers = '88'
我得到一个包含这些 ECU 和标识符的所有车辆的列表。但问题是我只想展示具有我在那里编写的两个 ECU 的车辆,而不是仅具有这些所需 ECU 之一的车辆。我该怎么做?
【问题讨论】:
-
您没有名为
Vehicle的列。什么可以识别车辆? -
一辆车包含不同的ECU,这些不同的ECU可以使用不同的数字来识别,例如88、89。如上图所示,车辆总是有一个名字,在这种情况下“阿米尔”。如前所述,Aamir 包含大约 20 个不同的 ECU,其中每个 ECU 有大约 5 个不同的标识符。
标签: sql sql-server stored-procedures ssms