Stored procedures 仅使用提供的字段的T-SQL匹配过程

Stored procedures 仅使用提供的字段的T-SQL匹配过程,stored-procedures,sql-server-2000,matching,Stored Procedures,Sql Server 2000,Matching,我正试图编写一个存储过程,根据客户提供给我们的信息,将医生列表与数据库中的现有记录进行匹配。目前,我们使用MS-Access根据给定的标识符手动加入,但这个过程往往冗长且耗时,因此需要实现自动化 我试图做的是创建一个临时表,其中包含所有可能匹配的列,然后使用字段作为连接条件运行一系列匹配查询,以获得要传递回的标识符 例如,可用的匹配字段是Name、NPI、MedicaidNum和DOB,因此我将编写如下内容: UPDATE Temp SET Temp.RECID = Phy.RECID FROM

我正试图编写一个存储过程,根据客户提供给我们的信息,将医生列表与数据库中的现有记录进行匹配。目前,我们使用MS-Access根据给定的标识符手动加入,但这个过程往往冗长且耗时,因此需要实现自动化

我试图做的是创建一个临时表,其中包含所有可能匹配的列,然后使用字段作为连接条件运行一系列匹配查询,以获得要传递回的标识符

例如,可用的匹配字段是Name、NPI、MedicaidNum和DOB,因此我将编写如下内容:

UPDATE Temp
SET Temp.RECID = Phy.RECID
FROM TempTable Temp
INNER JOIN Physicians Phy
ON Phy.Name = Temp.Name
AND Phy.NPI = Temp.NPI
AND Phy.MedicaidNum = Temp.MedicaidNum
AND Phy.DOB = Temp.DOB

UPDATE Temp
SET Temp.RECID = Phy.RECID
FROM TempTable Temp
INNER JOIN Physicians Phy
ON Phy.Name = Temp.Name
AND Phy.NPI = Temp.NPI
AND Phy.MedicaidNum = Temp.MedicaidNum
WHERE Temp.RECID IS NULL

...etc
DECLARE @Field1
DECLARE @Field2
....
UPDATE Temp
SET Temp.RECID = Phy.RECID
FROM TempTable Temp
INNER JOIN Physicians Phy
ON Phy.@Field1 = Temp.@Field1
AND Phy.@Field2 = Temp.@Field2
问题在于,可能会提供大约15个不同的标识符,而客户机通常只为每个记录集提供三到四个标识符。因此,在考虑空值时,可能需要编写上百个不同的查询,以便只在六个提供的字段上进行匹配

我认为可能有一种方法可以传入一个(或多个)变量,该变量指示数据集实际提供了哪些列,然后编写一个动态连接语句和/或where子句,但我不知道这是否适用于T-SQL。比如:

UPDATE Temp
SET Temp.RECID = Phy.RECID
FROM TempTable Temp
INNER JOIN Physicians Phy
ON Phy.Name = Temp.Name
AND Phy.NPI = Temp.NPI
AND Phy.MedicaidNum = Temp.MedicaidNum
AND Phy.DOB = Temp.DOB

UPDATE Temp
SET Temp.RECID = Phy.RECID
FROM TempTable Temp
INNER JOIN Physicians Phy
ON Phy.Name = Temp.Name
AND Phy.NPI = Temp.NPI
AND Phy.MedicaidNum = Temp.MedicaidNum
WHERE Temp.RECID IS NULL

...etc
DECLARE @Field1
DECLARE @Field2
....
UPDATE Temp
SET Temp.RECID = Phy.RECID
FROM TempTable Temp
INNER JOIN Physicians Phy
ON Phy.@Field1 = Temp.@Field1
AND Phy.@Field2 = Temp.@Field2

通过这种方式,我可以限制需要编写的查询的数量,只需要担心匹配的字段的数量,而不需要担心哪些字段是特定的。不过,也许有更好的方法解决这个问题?

您可以这样做,但请注意,这种方法非常容易发生SQL注入。这只是为了说明如何做这样的事情的原则。我让你决定你想用它做什么。对于这段代码,我让proc包含三个字段:

CREATE PROC DynamicUpdateSQLFromFieldList   @Field1 VARCHAR(50) = NULL,
                                            @Field2 VARCHAR(50) = NULL,
                                            @Field3 VARCHAR(50) = NULL,
                                            @RunMe BIT = 0
AS
BEGIN

DECLARE @SQL AS VARCHAR(1000);

    SELECT  @SQL = 'UPDATE Temp
                    SET Temp.RECID = Phy.RECID  
                    FROM TempTable Temp
                    INNER JOIN Physicians Phy ON ' +
                    COALESCE('Phy.' + @Field1 + ' = Temp.' + @Field1 + ' AND ', '') +
                    COALESCE('Phy.' + @Field2 + ' = Temp.' + @Field2 + ' AND ', '') +
                    COALESCE('Phy.' + @Field3 + ' = Temp.' + @Field3, '') + ';';

    IF @RunMe = 0               
        SELECT @SQL AS SQL;
    ELSE
        EXEC(@SQL)

END
我添加了一个调试模式标志,以便在不想运行SQL时可以看到它。因此,例如,如果您运行:

EXEC DynamicUpdateSQLFromFieldList @field1='col1', @field2='col2', @field3='col3'

生成的SQL将是:

UPDATE Temp
SET Temp.RECID = Phy.RECID
FROM TempTable Temp INNER JOIN Physicians Phy
ON Phy.col1 = Temp.col1 AND
   Phy.col2 = Temp.col2 AND
   Phy.col3 = Temp.col3;
如果运行此行:

EXEC DynamicUpdateSQLFromFieldList @field1='col1', @field2='col2', @field3='col3', @RunMe=1
它将执行更新。如果希望更安全,可以在sys表中列出传入的字段名,以确保在执行任何代码之前每个表中实际存在列