Sql server Insert Into with subquery将多行插入数据库

Sql server Insert Into with subquery将多行插入数据库,sql-server,subquery,insert-into,Sql Server,Subquery,Insert Into,目前,我正在努力生成一个“通知”查询以正确工作 我正在处理一个查询,该查询将向一个表中添加一个字符串,该表将同时添加多行,其中只有一列将在“批量插入”中更改: 我目前有: public static void addNotification(string notification) { SqlConnection scon = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"

目前,我正在努力生成一个“通知”查询以正确工作

我正在处理一个查询,该查询将向一个表中添加一个字符串,该表将同时添加多行,其中只有一列将在“批量插入”中更改:

我目前有:

    public static void addNotification(string notification)
    {
        SqlConnection scon = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);

        using (SqlCommand scmd = new SqlCommand())
        {
            scmd.Connection = scon;
            scmd.CommandType = CommandType.Text;
            scmd.CommandText = "INSERT INTO notificationAck (Email, Notification, isAcknowledged) VALUES ((SELECT Email FROM AspNetUsers), '" + notification + "' ,0)";
            scon.Open();
            int status = scmd.ExecuteNonQuery();
            scon.Close();
        }
    }
但是,在传递类似“this is a notification”的字符串时,会出现以下错误:

子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 表情。声明已终止

那么,有人能解释一下这个查询应该如何运行吗

该表包含以下列:

我知道“PK1”不是最好的实践,但这只是一个用于测试目的的表(它设置为自动递增)

因此,isAcknowledged应该设置为0,通知应该是这个字符串,并且应该从表AspNetUsers?的每一行中选择电子邮件


有人能给我解释一下我应该如何将这些数据添加到数据库中吗?

类似的方法应该可以:

scmd.CommandText = "INSERT INTO notificationAck (Email, 
                                                 Notification, 
                                                 isAcknowledged) 
                    SELECT Email, '" + notification + "', 0
                    FROM AspNetUsers";

插入选择
不需要
。因此,您只需使用一个
SELECT
语句,从
AspNetUsers
中检索
Email
字段,再加上两个常量值。

类似的操作应该可以:

scmd.CommandText = "INSERT INTO notificationAck (Email, 
                                                 Notification, 
                                                 isAcknowledged) 
                    SELECT Email, '" + notification + "', 0
                    FROM AspNetUsers";

插入选择
不需要
。因此,您只需使用
SELECT
语句,从
AspNetUsers
检索
Email
字段加上两个常量值。

在使用查询生成结果时,您不希望使用
值。您可以将
INSERT
查询更改为:

INSERT INTO notificationAck (Email, Notification, isAcknowledged) 
SELECT Email, 'SOME STRING', 0 FROM AspNetUsers
翻译成代码的代码如下所示:

scmd.CommandText = "INSERT INTO notificationAck (Email, Notification, isAcknowledged) 
                    SELECT Email, '" + notification + "', 0 FROM AspNetUsers";

在使用查询生成结果时,您不希望使用
值。您可以将
INSERT
查询更改为:

INSERT INTO notificationAck (Email, Notification, isAcknowledged) 
SELECT Email, 'SOME STRING', 0 FROM AspNetUsers
翻译成代码的代码如下所示:

scmd.CommandText = "INSERT INTO notificationAck (Email, Notification, isAcknowledged) 
                    SELECT Email, '" + notification + "', 0 FROM AspNetUsers";
你的问题

SELECT Email FROM AspNetUsers
按照错误指示返回多行。您需要更改它,使其仅返回一行,例如:

SELECT TOP 1 Email FROM AspNetUsers
然后按如下所示更改您的命令

scmd.CommandText = "INSERT INTO notificationAck (Email, Notification, isAcknowledged) SELECT TOP 1 Email " + notification + "' ,0 FROM AspNetUsers'";
如果要插入多行,请从查询中删除前1行

scmd.CommandText = "INSERT INTO notificationAck (Email, Notification, isAcknowledged) SELECT Email " + notification + "' ,0 FROM AspNetUsers'";
你的问题

SELECT Email FROM AspNetUsers
按照错误指示返回多行。您需要更改它,使其仅返回一行,例如:

SELECT TOP 1 Email FROM AspNetUsers
然后按如下所示更改您的命令

scmd.CommandText = "INSERT INTO notificationAck (Email, Notification, isAcknowledged) SELECT TOP 1 Email " + notification + "' ,0 FROM AspNetUsers'";
如果要插入多行,请从查询中删除前1行

scmd.CommandText = "INSERT INTO notificationAck (Email, Notification, isAcknowledged) SELECT Email " + notification + "' ,0 FROM AspNetUsers'";
如果只想插入一行,请在子查询中选择
Top 1

试一试

如果要插入AspNetUsers中的所有行,请使用

如果只想插入一行,请在子查询中选择
Top 1

试一试

如果要插入AspNetUsers中的所有行,请使用



插入选择
不需要
插入选择
不需要
:感谢您的及时回复。我没有意识到我必须将表名放在末尾,这也造成了一个问题。所以谢谢你:)谢谢你的及时回复。我没有意识到我必须将表名放在末尾,这也造成了一个问题。所以谢谢你:)谢谢你的解释。重申我也说过的话,我没有意识到我必须将表名放在语句的末尾,而不是在it@jbutler483不客气。还请注意,您应该使用
SqlParameter
对象来代替
notification
变量。您的代码易于SQL注入。管理员控件仅在此处:)工作正常!!谢谢你的解释。重申我也说过的话,我没有意识到我必须将表名放在语句的末尾,而不是在it@jbutler483不客气。还请注意,您应该使用
SqlParameter
对象来代替
notification
变量。您的代码易于SQL注入。管理员控件仅在此处:)工作正常!!谢谢你的回答。但是,我需要为返回的每封电子邮件插入。谢谢您的回答。但是,我需要为返回的每封电子邮件插入。谢谢您的回答。但是,我需要为每个返回的电子邮件插入。好的。看来我误解了你的问题。你当然是对的。谢谢你的回答。但是,我需要为每个返回的电子邮件插入。好的。看来我误解了你的问题。你当然是对的。