替换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(在你有一个完全工作的应用程序,并且你发现它的性能是不可接受的之前,不要再考虑微优化,比如你最初的问题)。