我无法在线找到问题的解决方案。如果有可能,我该如何编写一个使用参数值以及从另一个表中选择一个值的SQL Insert语句。
示例:
"INSERT INTO Users (user_name, user_csn, user_adid, user_contact, user_adminpriviledge, user_datestart, user_active, user_team)
VALUES (@username, @usercsn, @useradid, @usercontact, @userauth, @userstart, @useractive, @userteam = (SELECT team_id FROM teaminfo WHERE team_name = '" & ddlAddTeam.SelectedValue & "'))"
我知道该示例是错误的,只是尽力表示我在代码中寻找的内容。
另一个问题是关于别名和数据读取器。我似乎无法为别名列名执行“ reader(“ column_name”)“?
示例:
query = "SELECT u.*, t.team_name FROM Users u
JOIN teaminfo t ON u.user_team = t.team_id WHERE user_csn = '" & GV.userCSN & "'"
我尝试使用
reader("u.user_name")
但也失败了。
答案 0 :(得分:0)
INSERT
statement的数据源可以是SELECT
语句-请参见链接页面上语句定义的<dml_table_source>
部分-并且SELECT
语句可以包含选择列表中的参数。这是一个简单的示例:
declare @Target table (Id bigint, Datum char(1));
declare @Source table (Id bigint);
declare @Datum char(1) = 'X';
insert @Source values (1);
insert @Target
select
Id = S.Id, -- Value from another table
Datum = @Datum -- Parameter
from
@Source S;
上面链接的页面上还有更多示例;向下滚动到“从其他表插入数据”部分标题。
此外,如果您要如示例所示使用(C#?)代码构建查询,则应确实将任何参数作为参数传递,而不是尝试将其直接构建到查询文本中。阅读SQL injection attacks,了解原因。
答案 1 :(得分:0)
您的INSERT查询应该类似于
"INSERT INTO Users (user_name, user_csn, user_adid, user_contact, user_adminpriviledge, user_datestart, user_active, user_team)
VALUES (@username, @usercsn, @useradid, @usercontact, @userauth, @userstart, @useractive, (SELECT team_id FROM teaminfo WHERE team_name = @userteam ))"
第二次从读取器中获取时,它应该是:
reader("user_name") // I am not sure about this. You can put break point and open the object in watch window
答案 2 :(得分:0)
您需要插入操作的其他语法:INSERT INTO ... SELECT ... FROM ...
:
INSERT INTO Users (user_name, user_csn, user_adid, user_contact, user_adminpriviledge, user_datestart, user_active, user_team)
SELECT @username, @usercsn, @useradid, @usercontact, @userauth, @userstart, @useractive, team_id --<--not here's your column
FROM teaminfo
WHERE team_name = @param
而且,它看起来像是.NET(C#或VB代码),因此您很容易通过SQL注入将字符串与参数连接起来!
在我的SQL中,我已经将@param
放置在适当的位置,然后使用您可能正在使用的SqlCommand
,必须调用Add
集合上的方法SqlCommand.Paramteres
,然后为其提供值为ddlAddTeam.SelectedValue
。
尝试以下代码:
Using connection = New SqlConnection("connString")
Using com = New SqlCommand
com.Connection = connection
com.CommandText = "INSERT INTO Users (user_name, user_csn, user_adid, user_contact, user_adminpriviledge, user_datestart, user_active, user_team)
Select @username, @usercsn, @useradid, @usercontact, @userauth, @userstart, @useractive, team_id --<--Not here's your column
From teaminfo
Where team_name = @param"
com.Parameters.Add("@param", SqlDbType.VarChar).Value = ddlAddTeam.SelectedValue
connection.Open()
End Using
End Using
对于列别名:在数据阅读器中,您使用列别名,没有表名(在示例中,点名前的u
)。尝试为所有列提供别名,以避免出现此类问题。