替换SQL查询

替换SQL查询,sql,sql-server,sql-server-2008,case-when,Sql,Sql Server,Sql Server 2008,Case When,我要替换此查询 DECLARE @tmpUser TABLE( UserId INT, UserType INT ) INSERT INTO @tmpUser SELECT u.UserId, 1 FROM Users u (nolock) WHERE u.UPIN = @AttendingDoctorID IF @@ROWCOUNT = 0 BEGIN INSERT INTO @tmpUser SELECT u.UserId,

我要替换此查询

DECLARE @tmpUser TABLE( UserId INT, UserType INT )

INSERT INTO @tmpUser
SELECT
    u.UserId,
    1
FROM
    Users u (nolock)
WHERE
    u.UPIN = @AttendingDoctorID

IF @@ROWCOUNT = 0
BEGIN
    INSERT INTO @tmpUser
    SELECT
        u.UserId,
        1
    FROM
        Users u (nolock)
    WHERE
        u.FirstName = @AttendingDoctorFirstName AND
        u.LastName = @AttendingDoctorLastName
END
SELECT * FROM @tmpUser

在不使用
@tmpUser
或任何其他临时表的情况下执行单个SQL SELECT语句

使用或代替两个单独的查询如何

我认为这会达到目的

SELECT
    u.UserId, 1
FROM
    Users u (nolock)
WHERE
    (u.UPIN = @AttendingDoctorID)
    OR
    (u.FirstName = @AttendingDoctorFirstName AND
    u.LastName = @AttendingDoctorLastName)

下面使用了额外的查找,但它满足您的要求。我不确定这是否比使用临时表更有效,尽管如果UPIN被索引,那么我怀疑它会更有效

IF EXISTS(
    SELECT 
        1 
    FROM 
        Users u 
    WHERE 
        u.UPIN = @AttendingDoctorID)
BEGIN
    SELECT 
        u.UserId, 1 
    FROM 
        Users u  WITH(nolock)
    WHERE 
        u.UPIN = @AttendingDoctorID
END ELSE BEGIN
    SELECT
        u.UserId,
        1
    FROM
        Users u (nolock)
    WHERE
        u.FirstName = @AttendingDoctorFirstName AND
        u.LastName = @AttendingDoctorLastName
END

我不想使用@tmpUser或任何其他临时表,那么您想要什么,需要什么。你的查询是不等价的,因为如果@AttentingDoctorid的查询与任何内容都不匹配,那么原始海报的查询只会根据名称选择一个用户。我不知道你为什么这么说,因为我在这两种情况之间徘徊,如果第一个剧本成功了,它会给出另一个结果,另一个是寻找第二个条件。现在还不清楚你在问什么-这两个问题相互之间没有任何关系,无法对gbn的评论进行扩展。。。在一般情况下,您不需要nolock。添加此提示将告诉SQL Server不要接受或遵守对读取数据的任何锁定。它可以提高查询性能,尤其是并发性。但这是以牺牲一致性为代价的,因为您可能会最终读取脏数据,即当前正在被另一个事务更新(但尚未提交)的数据。这可能不是您想要的,因此除非您有充分的理由使用nolock(即高度并发的环境),否则您可能应该将其忽略。@MikeyCee:我认为……这是一个高度并发的环境……因为我从一个时间间隔为500毫秒的线程调用此SP。你说呢?高度并发就像成百上千个线程同时读取和更新相同的数据。我怀疑,在你的情况下,这不会发生,尽管我可能是错的。顺便说一句,500毫秒在CPU周期中是永恒的,不过这取决于您调用SP的线程数。如果它只是一个线程,那么就不能算作高度并发,您应该忘记nolock(在你有一个完全工作的应用程序,并且你发现它的性能是不可接受的之前,不要再考虑微优化,比如你最初的问题)。