我们有一个客户端应用程序在SQL Server 2005上运行一些SQL,如下所示:
BEGIN TRAN;
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
COMMIT TRAN;
Run Code Online (Sandbox Code Playgroud)
它由一个长字符串命令发送.
如果其中一个插入失败,或者命令的任何部分失败,SQL Server是否会回滚事务?如果它没有回滚,我是否必须发送第二个命令才能回滚?
我可以给出关于我正在使用的api和语言的细节,但我认为SQL Server应该对任何语言做出相同的响应.
我正在使用SQL Server并尝试使用SQL一次更新多个表:
以下查询:
update table1
set A.ORG_NAME = @ORG_NAME, B.REF_NAME = @REF_NAME
from table1 A, table2 B
where B.ORG_ID = A.ORG_ID
and A.ORG_ID = @ORG_ID
Run Code Online (Sandbox Code Playgroud)
给出错误消息:
无法绑定多部分标识符"A.ORG_NAME".
错误消息是什么意思?
请考虑以下表格:"用户"和"推文"
user_id name tweet_id user_id tweet spam
----------------- ----------------------------------
1 SUSPENDED 1 1 lorem ipsum 0
2 foo 2 1 dolor 0
3 bar 3 2 samet 0
4 SUSPENDED 4 1 stunitas 0
5 3 hello 0
6 4 spamzz! 0
Run Code Online (Sandbox Code Playgroud)
我想通过将SUSPENDED用户发布的所有推文标记为垃圾邮件来更新"推文"表.因此,在上面的示例中,通过将"垃圾邮件"值从0更新为1,将tweet_id 1,2,4和6的推文标记为垃圾邮件.
我加入这两张桌子时遇到了麻烦.到现在为止,我只需要加入SELECT语句,但这似乎更麻烦:
UPDATE tweets SET spam = 1 WHERE tweets.user_id = users.user_id
AND users.name = 'SUSPENDED'
Run Code Online (Sandbox Code Playgroud)
这肯定是行不通的......谁能指出我正确的方向?
我想知道执行以下操作的标准/最佳方式是什么:
我在asp.net中有一个表单Web应用程序并使用C#
用户将数据输入表单并单击INSERT,它将数据插入4个不同的表中.
这些领域是:
primarykey, animal, street, country
Run Code Online (Sandbox Code Playgroud)
该表格允许多个动物,多个街道和每个主键的多个国家/地区.所以,当我有这样的数据:
[1],[rhino,cat,dog],[luigi st, paul st], [russia,israel]
Run Code Online (Sandbox Code Playgroud)
我需要将它插入到这样的表中:
table1:
1,rhino
1,cat
1,dog
table2:
1,luigi st
1, paul st
table3:
1,russia
1,israel
Run Code Online (Sandbox Code Playgroud)
问题
我完全不知道如何做到这一点.如果我只有一个表和每个主键一组数据我会使用InsertQuery并以这种方式做,但因为它是多个表我不知道如何做到这一点?
我应该使用哪些控件来允许用户输入多个值?目前我只是使用文本框并考虑用半冒号分隔条目,但这可能不是正确的方法.
我有2个表需要更新:
表A包括:ID,personName,日期,状态
表B包括:PersonID,日期,状态
对于A中的每一行,B中可以有多行具有相同的personID
我需要"循环"来自状态= 2的A的所有结果,并将日期和状态更新为1.
此外,对于A中status = 2的每一行,我需要更新B中具有相同personID的所有行(即A.ID == B.PersonID) - 我还需要将日期和状态更新为1.
所以基本上,如果我以编程方式(或算法)执行此操作,那就是这样的:
Foreach(var itemA in A)
If (itemA.status = 2)
itemA.status to 1
itemA.date = GetDate()
foreach(var itemB in B)
if(itemB.PersonID == itemA.ID && itemB.status != 2 )
Change itemB.status to 1
Change itemB.date = GetDate()
Run Code Online (Sandbox Code Playgroud)
我知道如何使用以下sql语句更新B中的所有行:
UPDATE
B
SET
status = 1,
date = GETDATE()
FROM
B
INNER JOIN
A
ON
B.PersonID = A.ID
Run Code Online (Sandbox Code Playgroud)
问题是我不知道如何更新表A,因为更新语句中不能有多个表
谢谢你的帮助
protected void btnSubmit_Click(object sender, EventArgs e)
{
connectionString = ConfigurationManager.ConnectionStrings["LeaveMangementSystemCS"].ConnectionString;
conn = new SqlConnection(connectionString);
string sql = "UPDATE LeaveType SET LeaveType.Type=@Type, LeaveType.Description=@Description, LeaveType.NumOfDays=@NumOfDays, LeaveCategory.Category=@Category FROM LeaveType INNER JOIN LeaveCategory on LeaveType.LeaveCategoryId = LeaveCategory.Id WHERE LeaveType.Id=@id";
try
{
cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@Type", tbType.Text);
cmd.Parameters.AddWithValue("@Description", tbDescription.Text);
cmd.Parameters.AddWithValue("@NumOfDays",tbNumOfDays.Text);
cmd.Parameters.AddWithValue("@Category", ddlLeaveCategory.Text);
cmd.Parameters.AddWithValue("@id", lblIdOut.Text);
conn.Open();
int rows = cmd.ExecuteNonQuery();
if (rows > 0)
{
lblOutput.Text = " Updated successfully.";
}
}
catch (Exception ex)
{
lblOutput.Text = "Error Message : " + ex.Message; …
Run Code Online (Sandbox Code Playgroud)