Sql server 插入多行,根据另一个表列计数

Sql server 插入多行,根据另一个表列计数,sql-server,vb.net,Sql Server,Vb.net,我有三张桌子项目,库存详情,分行 我想一次插入其中两个。项目和库存详情表 Item有3列=ItemID,Title,Price StockDetail有3列=ItemID,BranchID,Stock Branch有1列=BranchID 在下面的代码中,INSERT-intoItem可以正常工作,但对于StockDetail表,它不会插入任何内容 现在,对于StockDetail,如果它有效,我想插入它,条件如下: 如果您添加一个项目,那么它将添加此项目以及所有已存在的项目 也就是说,每个分支

我有三张桌子<代码>项目,
库存详情
分行

我想一次插入其中两个。
项目
库存详情

Item
有3列=
ItemID
Title
Price

StockDetail
有3列=
ItemID
BranchID
Stock

Branch
有1列=
BranchID

在下面的代码中,INSERT-into
Item
可以正常工作,但对于
StockDetail
表,它不会插入任何内容

现在,对于
StockDetail
,如果它有效,我想插入它,条件如下:

如果您添加一个项目,那么它将添加此项目以及所有已存在的项目

也就是说,每个分支都会有此项

e、 g:

您添加了一个项目,而

Branch
有3行
BranchID
=
BR000
BR001
BR002

它将一次插入到
StockDetail
,同时插入3行(单个查询)

StockDetail
的完整结果(单个查询):


守则:

'Add function'
'Insert to StockDetail'
Dim theCommand As New SqlCommand
Dim theDataAdapter As New SqlDataAdapter
Dim theDataTable As New DataTable
theCommand.Connection = theConnection
theCommand.CommandText = "INSERT INTO StockDetail VALUES(
                         '" & Me.TextBox_ItemID.Text & "',
                         SELECT COUNT(BranchID) FROM Branch,
                         '0'
                         )"
theDataAdapter.SelectCommand = theCommand
'Insert to Item'
theCommand.Connection = theConnection
theCommand.CommandText = "INSERT INTO Item VALUES('" & Me.TextBox_ItemID.Text & "', '" & Me.TextBox_Title.Text & "', '" & Me.TextBox_Price.Text & "')"
theDataAdapter.SelectCommand = theCommand
theDataAdapter.Fill(theDataTable)
DataGridView_Item.DataSource = theDataTable
theCommand.Dispose()
theDataAdapter.Dispose()
更新:

下面的代码将告诉您正在工作的多重插入,但不会告诉您BranchID插入

我现在想要什么

好的,而不是插入
1
1


我想用
BR000
BR001
插入它。(基于所有已存在的
BranchID

用于插入StockDetail的SQL命令文本不符合您的要求。此代码虽然在语法上不正确(如果要使用SELECT作为值,需要将其括在括号中,如下所示:

theCommand.CommandText = "INSERT INTO StockDetail VALUES(
                         '" & Me.TextBox_ItemID.Text & "',
                         (SELECT COUNT(BranchID) FROM Branch),
                         '0'
                         )"
theCommand.CommandText = "INSERT INTO StockDetail SELECT 
                         '" & Me.TextBox_ItemID.Text & "',
                         BranchID, '0' FROM Branch
                         )"
),将在表中插入您的ID、分支数量计数和零

对于您希望发生的事情,您的代码看起来更像这样:

theCommand.CommandText = "INSERT INTO StockDetail VALUES(
                         '" & Me.TextBox_ItemID.Text & "',
                         (SELECT COUNT(BranchID) FROM Branch),
                         '0'
                         )"
theCommand.CommandText = "INSERT INTO StockDetail SELECT 
                         '" & Me.TextBox_ItemID.Text & "',
                         BranchID, '0' FROM Branch
                         )"

下面是如何在第一条insert语句中使用参数。我想你在这里仍然有一些非常严重的逻辑问题。这将在StockDetail中插入一行,而这些值毫无意义。将分支表中的行数作为BranchID插入,这可能不是您真正想要的。我猜您想要的是表中每个分支的一行

theCommand.CommandText = "INSERT INTO StockDetail(ItemID, BranchID, Price) VALUES(
                         @ItemID,
                         (SELECT COUNT(BranchID) FROM Branch),
                         0
                         )"
theCommand.Parameters.Add("@ItemID", SqlDbType.Varchar).Value = Me.TextBox_ItemID.Text;
我怀疑你真正想要的是这样的东西

theCommand.CommandText = "INSERT INTO StockDetail(ItemID, BranchID, Price) 
                        select @ItemID
                            , BranchID
                            , 0
                        from Branch";
theCommand.Parameter.Add("@ItemID", SqlDbType.Varchar).Value = Me.TextBox_ItemID.Text;

同样,您需要参数化这些查询。继续像这样构建字符串是危险的,也是近乎疏忽的。您还应该养成指定要插入的列的习惯,或者您的代码非常脆弱。当表更改时,您的查询将被破坏。@SeanLange wtf,我不懂参数化。我不知道顺便问一下,你有没有看过我在你的最后一个问题中发布的链接?你试过谷歌吗?我会给你举个例子。不可能,那个网站看起来可疑!这看起来像一个骗局,lolI不能给这个a+1,因为它对sql注入非常开放。为什么
ItemID
0
会从分支中获取?您没有读到分支只有一列,
BranchID
。您可以在select语句中选择常量。对其进行了测试,结果无效。马上,我要先睡觉了。wtf
StockDetail
没有
Title
Price
!再读一遍这个问题,哈哈,我确实提到了每个表的列。如果你能把你的表作为我们可以使用的东西来发布,而不是猜测,那就不会那么糟糕了。您似乎想要一个100%完美编码的解决方案,但不愿意付出太多努力。不需要太大的飞跃就可以看出这是一个打字错误,因为我是凭空编写代码的。说真的……不要再胡说八道了,尽量让事情保持专业。好吧,好吧,对不起,刚才的粗鲁对话。我将尝试这些方法,并给出结果。这是因为在您的示例中,您从未调用该方法来实际运行该语句。执行查询