我有一个表tblDocs
,其中有几列:
DocName varchar(50)
DocLocation int
Active int
DocID int
表格中的所有条目都有DocName
和DocLocation
。 Active
和DocID
是空白的。
我需要做的是tblDocs
中的每一行我需要检查DocLocation
的值并根据该值更新tblDocs
,设置Active
和DocID
列。我以为我会使用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?
答案 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
当您需要检查该行中的值,然后根据我发现游标效果最好的内容进行更新时。但请注意,如果表格非常大或者在游标中完成了任何连接,则存在性能问题。