我有一个存储过程,它根据用户发送的内容查询一些员工记录。
在用户界面上,用户将输入多个数据点,例如电子邮件地址,用户ID或员工姓名。此存储过程检查它们提供的数据类型,然后在数据库中的该字段中搜索记录。
输入存储过程:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<data>
<dataPoints>
<dataPoint>
<order>0</order>
<value>Jim Bob</value>
</dataPoint>
<dataPoint>
<order>1</order>
<value>Sally Jones</value>
</dataPoint>
</dataPoints>
</data>
</root>
查询:
@dataType VARCHAR (20), @data XML
AS
BEGIN
SET NOCOUNT ON;
BEGIN
-- Create a temp table
DECLARE @dataSet TABLE (data VARCHAR(100), [order] INT);
INSERT INTO @dataSet( data , [order] )
SELECT
ParamValues.x1.value('value[1]', 'VARCHAR(100)') ,
ParamValues.x1.value('order[1]', 'INT')
FROM
@data.nodes('/root/data/dataPoints/dataPoint') AS ParamValues(x1)
-- Search Employees
SELECT
ec.FirstName, ec.PreferredName, ec.LastName,
ec.NTID, ec.QID,
ec.DepartmentName, ec.SegmentName,
ec.CenterName, ec.RoleName, ec.MarketName,
ec.IncentivePlanName,
ec.CostCenterID,
ec.SupFirstName, ec.SupPreferredName, ec.SupLastName,
ec.SiloName,
ec.AreaName,
ec.PersonnelID,
d.[order]
FROM
Resources.emp.EmployeeComplete AS ec
INNER JOIN
@dataset AS d ON d.data = CASE
WHEN @dataType = 'NTID' THEN ec.ntid
WHEN @dataType = 'QID' THEN ec.QID
WHEN @dataType = 'Emp ID' THEN ec.EmpID
WHEN @dataType = 'Email Address' THEN ec.Email
WHEN @dataType = 'Personnel ID' OR @dataType = 'Sap ID' THEN ec.PersonnelID
--WHEN @dataType = 'Name' THEN (
-- (ec.FirstName + ' ' + ec.LastName)
-- OR (ec.PreferredName + ' ' + ec.LastName)
-- OR (ec.LastName + ', ' + ec.FirstName)
-- OR (ec.LastName + ', ' + ec.PreferredName
-- )
END
FOR XML PATH ('employees'), ELEMENTS, TYPE, ROOT ('root');
简而言之,我将搜索多个数据点并将它们放入XML字符串以传递给存储过程。一旦他们到达,我将它们放入临时表中,以便我可以将其与我的主要员工记录一起加入。
问题/疑问:
你会看到我的示例中有一些注释掉的代码,这就是我的问题所在。我的数据库中有三个名称字段。 First Name
,Preferred Name
,Last Name
。
我基本上需要测试用户提供的内容,并根据他们输入的组合查找员工。 UI中的所有用户都选择提供名称,但不提供其所在的格式。
出于这个原因,我需要检查一下我是否能找到几种不同格式的记录。
在这种情况下的问题是我无法使用OR
语句中的CASE
条件加入我的数据集。
如果@dataType = 'Name'
,我需要能够将我的临时表加入到几种不同的组合可能性中。
我们确实让他们意识到的一件事是他们无法混合搭配。这意味着他们无法通过FirstName LastName
搜索进行LastName FirstName
。
我无法解释这一点,所以如果我需要以某种方式澄清,请告诉我。
答案 0 :(得分:0)
推动CASE
中的方程式。如果确实如此,请THEN
返回1.检查CASE
是否返回1.当且仅当它返回时,您已找到匹配项。在WHEN
的条件下,您可以使用布尔运算符。因此,您可以在那里构建OR
(或使用IN
,如下所示)。
...
CASE
WHEN @dataType = 'NTID' AND d.data = ec.ntid THEN 1
WHEN @dataType = 'QID' AND d.data = ec.QID THEN 1
...
WHEN (@dataType = 'Personnel ID' OR @dataType = 'Sap ID') AND d.data = ec.PersonnelID THEN 1
WHEN @dataType = 'Name' AND (d.data IN ('' + ec.FirstName + ' ' + ec.LastName,
'' + ec.PreferredName + ' ' + ec.LastName,
'' + ec.LastName + ', ' + ec.FirstName,
'' + ec.LastName + ', ' + ec.PreferredName) THEN 1
END = 1
...
答案 1 :(得分:0)
将OR加入你的加入怎么样?
return Response.ok(reader, MediaType.APPLICATION_XML_TYPE)
.header(CONTENT_DISPOSITION, "attachment; filename=" + "packData_" + productCode + "_" + batchId + "_" + timeStamp + ".xml")
.build();
我不确定SQL是否足够聪明,如果你有这些字段就可以在这些字段上使用正确的索引,尤其是在组合列时。您可以为那些组合名称或可以索引的计算列创建索引视图。最好将它们分散到if / thens中的单独查询中,以便SQL可以根据您加入的字段优化每个查询,然后执行一个查询。