对于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