对于SQL中的每个等价项

对于SQL中的每个等价项,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有一个表,tblDocs,它有几个列: DocName varchar(50) DocLocation int Active int DocID int 表中的所有条目都有DocName和DocLocation活动和文档ID为空 我需要做的是,对于tblDocs中的每一行,我需要检查DocLocation的值,并根据该值更新tblDocs,设置Active和DocID列。我想我会在时使用一个案例,但我不确定-我不太懂sql。如果我使用c#或vb.net,它将相当于每个循环的 foreach

我有一个表,
tblDocs
,它有几个列:

DocName varchar(50)
DocLocation int
Active int
DocID int
表中的所有条目都有
DocName
DocLocation
<代码>活动和
文档ID
为空

我需要做的是,对于
tblDocs
中的每一行,我需要检查
DocLocation
的值,并根据该值更新
tblDocs
,设置
Active
DocID
列。我想我会在时使用一个
案例,但我不确定-我不太懂sql。如果我使用c#或vb.net,它将相当于每个
循环的

foreach row as DBRow in tblDocs
    row.active = 1
    row.docID = ID
next
对于SQL Server 2005,您是如何做到这一点的

更新

从下面的几个回答中,听起来我将使用
UPDATE
语句。所以我可以通过这样做来实现这一点

UPDATE tblDocs
SET docID = 
    CASE DocLocation
        WHEN 1 THEN --do stuff
        WHEN 3 THEN --do other stuff

这将遍历TBLDOC的所有行,并根据DocLocation更新DocID?

SQL的强大之处在于您不需要编写循环;你只要告诉它你想更新的东西。例如,如果要将所有行设置为活动,只需执行以下操作

UPDATE tblDocs
SET Active = 1
你希望这取决于位置,所以为什么不

UPDATE tblDocs
SET Active = 1, DocID=42
WHERE DocLocation = 7

(当然,替换适当的值)可以编写一个查询来更新所有内容,但具体取决于您需要更改的内容。

SQL的强大之处在于您不需要编写循环;你只要告诉它你想更新的东西。例如,如果要将所有行设置为活动,只需执行以下操作

UPDATE tblDocs
SET Active = 1
你希望这取决于位置,所以为什么不

UPDATE tblDocs
SET Active = 1, DocID=42
WHERE DocLocation = 7

(当然,替换适当的值)可以编写一个查询来更新所有内容,但这取决于具体需要更改的内容。

SQL是一种用于数据操作的语言,不要用循环之类的传统控制流结构来考虑它。所有方法都尝试使用标准的SQL操作符,如INSERT、UPDATE或DELETE

这取决于您将使用什么值来更新表,但您肯定可以使用一个简单的update子句来完成

例如:

UPDATE tblDocs SET 
  Active = @activeValue,
  DocID = @docIDValue
WHERE DocLocation = @someLocation
如果更新的值来自另一个表,则可以执行类似的操作


编辑是的,您可以通过CASE语句来实现。

SQL是一种用于数据操作的语言,不要用循环之类的传统控制流结构来考虑它。所有方法都尝试使用标准的SQL操作符,如INSERT、UPDATE或DELETE

这取决于您将使用什么值来更新表,但您肯定可以使用一个简单的update子句来完成

例如:

UPDATE tblDocs SET 
  Active = @activeValue,
  DocID = @docIDValue
WHERE DocLocation = @someLocation
如果更新的值来自另一个表,则可以执行类似的操作


编辑是的,您可以使用CASE语句来执行该操作。

更新子句将应用于满足where段中表示的条件的所有行

例如: --将更新所有行,使docId=0 更新TblDocs集合docId=0

-- Will update all rows satisfying locationId = 1 putting docId = 0
UPDATE TblDocs SET docId = 0 WHERE locationId = 1

-- Will update all rows satisfying locationId = 1 putting docId = locationId + 1
UPDATE TblDocs SET docId = locationId + 1 WHERE locationId = 1
也就是说,在集合段中,您可以使用完成任务所需的任何逻辑

您甚至可以根据另一组数据(可能在其他表中)进行更新

UPDATE TblDocs
SET TblDocs.docId = TblLocations.LocId
FROM TblLocations
WHERE TblLocations.docId = TblDocs.docId
您可以使用游标,但请注意,几乎总是可以使用集合逻辑获得解决方案

下面是如何创建光标

DECLARE @DocName CHAR(10), @DocLocation INT, @Active BIT, @DocID INT

DECLARE C CURSOR 
FOR SELECT DocName, DocLocation, Active, DocID FROM TblDocs

OPEN C

FETCH NEXT FROM C INTO @DocName, @DocLocation, @Active, @DocID
WHILE @@FETCH_STATUS = 0 BEGIN

    -- do your logic here
    FETCH NEXT FROM C INTO @DocName, @DocLocation, @Active, @DocID
END
CLOSE C
DEALLOCATE C

Update子句将应用于满足where段中表示的条件的所有行

例如: --将更新所有行,使docId=0 更新TblDocs集合docId=0

-- Will update all rows satisfying locationId = 1 putting docId = 0
UPDATE TblDocs SET docId = 0 WHERE locationId = 1

-- Will update all rows satisfying locationId = 1 putting docId = locationId + 1
UPDATE TblDocs SET docId = locationId + 1 WHERE locationId = 1
也就是说,在集合段中,您可以使用完成任务所需的任何逻辑

您甚至可以根据另一组数据(可能在其他表中)进行更新

UPDATE TblDocs
SET TblDocs.docId = TblLocations.LocId
FROM TblLocations
WHERE TblLocations.docId = TblDocs.docId
您可以使用游标,但请注意,几乎总是可以使用集合逻辑获得解决方案

下面是如何创建光标

DECLARE @DocName CHAR(10), @DocLocation INT, @Active BIT, @DocID INT

DECLARE C CURSOR 
FOR SELECT DocName, DocLocation, Active, DocID FROM TblDocs

OPEN C

FETCH NEXT FROM C INTO @DocName, @DocLocation, @Active, @DocID
WHILE @@FETCH_STATUS = 0 BEGIN

    -- do your logic here
    FETCH NEXT FROM C INTO @DocName, @DocLocation, @Active, @DocID
END
CLOSE C
DEALLOCATE C
使用光标:

当您需要检查该行中的某个值,然后根据我发现游标工作得最好的内容对其进行更新时。但是,请注意,如果表太大或任何连接都是在游标中完成的,则会出现性能问题。

使用游标:

当您需要检查该行中的某个值,然后根据我发现游标工作得最好的内容对其进行更新时。但是,请注意,如果表太大或任何连接都是在游标中完成的,则会出现性能问题

如果我使用c#或vb.net,它将相当于一个for-each循环

<> P>这里的技巧是C语言和VB.NET(以及JavaScript、C++和任何其他你可能习惯的语言)都是过程语言。SQL是一种声明性语言。您描述一次作用于整个集合的操作

考虑到这一点,您希望描述一个操作,该操作将“检查DocLocation的值,并根据该值更新tblDocs,设置活动列和DocID列。”
为此,您使用
更新
查询和案例语句:

UPDATE tblDocs
SET 
  Active = CASE WHEN DocLocation = 'something' THEN 1 ELSE 0 END,
  DocID = CASE WHEN DocLocation = 'something' THEN NULL ELSE DocID END
请注意,此示例还演示了如何使用CASE语句来取消设置值(将其设置为null),甚至可以通过分配值本身来将其保留。若您真的希望保留很多值,那个么您应该使用WHERE子句来实现这一点也不值得

如果我使用c#或vb.net,它将相当于一个for-each循环

<> P>这里的技巧是C语言和VB.NET(以及JavaScript、C++和任何其他你可能习惯的语言)都是过程语言。SQL是一种声明性语言。您描述一次作用于整个集合的操作

考虑到这一点,您希望描述一个操作,该操作将“检查DocLocation的值,并根据该值更新tblDocs,设置活动列和DocID列。”为此,您使用
更新
查询和案例语句:

UPDATE tblDocs
SET 
  Active = CASE WHEN DocLocation = 'something' THEN 1 ELSE 0 END,
  DocID = CASE WHEN DocLocation = 'something' THEN NULL ELSE DocID END
请注意,此示例还演示了h