SQL插入参数值和另一个表中的值

时间:2018-08-08 05:24:46

标签: sql-server vb.net

我无法在线找到问题的解决方案。如果有可能,我该如何编写一个使用参数值以及从另一个表中选择一个值的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")

但也失败了。

3 个答案:

答案 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)。尝试为所有列提供别名,以避免出现此类问题。