对于SQL中的每个等效项

时间:2009-09-03 21:16:19

标签: sql sql-server sql-server-2005

我有一个表tblDocs,其中有几列:

DocName varchar(50)
DocLocation int
Active int
DocID int

表格中的所有条目都有DocNameDocLocationActiveDocID是空白的。

我需要做的是tblDocs中的每一行我需要检查DocLocation的值并根据该值更新tblDocs,设置ActiveDocID列。我以为我会使用CASE WHEN,但我不确定 - 我不太了解sql。如果我使用的是c#或vb.net,它将等同于for each循环。

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

这将遍历tblDocs的所有行,并将DocID更新为基于DocLocation?

6 个答案:

答案 0 :(得分:5)

SQL的强大之处在于您不需要编写循环;你只需要告诉它想要更新的内容。例如,如果您想将所有行设置为有效,那么您只需执行...

UPDATE tblDocs
SET Active = 1

您希望这取决于位置,所以为什么不...

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

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

答案 1 :(得分:4)

  

如果我使用c#或vb.net,它将相当于每个循环的a。

这里的诀窍是C#和VB.Net(以及javascript,c ++和您可能习惯使用的任何其他语言)是过程语言。 SQL是一种声明性语言。您描述了一次作用于整个的操作。

考虑到这一点,您想要描述一个"check the value of DocLocation and based on that value I update tblDocs, setting the Active and DocID columns."的操作。为此,您使用UPDATE查询和案例陈述:

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子句来做这件事。

答案 2 :(得分:0)

SQL是一种用于数据操作的语言,不考虑循环等传统控制流结构。 Allways尝试使用标准的SQL运算符,如INSERT,UPDATE或DELETE。

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

例如:

UPDATE tblDocs SET 
  Active = @activeValue,
  DocID = @docIDValue
WHERE DocLocation = @someLocation

如果更新的值来自另一个表,则可以执行类似的操作。

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

答案 3 :(得分:0)

SQL中不存在这个概念(好吧,几乎是真的)。在尝试使用SQL之前,您应该阅读SQL的基本概念,它与过程编程完全不同。

答案 4 :(得分:-1)

Update子句将应用于满足where segment

中表示的条件的所有行

例如:      - 将更新所有放入docId = 0的行     UPDATE TblDocs SET 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

你可以使用光标,但要注意几乎总是可以使用set logic获得解决方案。

这里是如何创建游标

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

答案 5 :(得分:-2)

使用光标:http://www.mssqltips.com/tip.asp?tip=1599

当您需要检查该行中的值,然后根据我发现游标效果最好的内容进行更新时。但请注意,如果表格非常大或者在游标中完成了任何连接,则存在性能问题。