SQL Server的新手,刚刚发现了存储过程的精彩世界 - 它已经让我头疼。来这里寻求帮助。
场景1 :给定一个表,我编写了一个存储过程并在C#中调用它来填充表。一切都按预期工作。
Country SQL table looks like this
存储过程:
CREATE PROCEDURE [dbo].[InsertRecord2]
@countryname nvarchar(64),
AS
INSERT INTO Country(CountryName)
VALUES (@countryname)
RETURN
使用C#调用
private void button1_Click(object sender, EventArgs e)
{
readonly SqlConnection _connection = new SqlConnection(@"Data Source=REXGBASQLP042;Initial Catalog=isg_cid;Integrated Security=True");
_connection.Open();
SqlCommand _command = _connection.CreateCommand();
_command.CommandType = CommandType.StoredProcedure;
_command.CommandText = "InsertRecord2";
_command.Parameters.Add("@countryname", SqlDbType.NVarChar).Value = countryname.Text;
_command.ExecuteNonQuery();
_connection.Close();
}
场景2 :我现在要创建一个SQL视图,包含上一个Country
表和另一个表,我们称之为City
。 CountryID
表的Country
是City
表中的FK。
存储过程:
CREATE PROCEDURE [dbo].[InsertRecord2]
@countryname nvarchar(64),
@cityname nvarchar(64)
AS
INSERT INTO Country(CountryName)
VALUES (@countryname)
INSERT INTO City(CityName)
VALUES (@cityname)
RETURN
使用C#调用:
private void button1_Click(object sender, EventArgs e)
{
readonly SqlConnection _connection = new SqlConnection(@"Data Source=REXGBASQLP042;Initial Catalog=isg_cid;Integrated Security=True");
_connection.Open();
SqlCommand _command = _connection.CreateCommand();
_command.CommandType = CommandType.StoredProcedure;
_command.CommandText = "InsertRecord2";
_command.Parameters.Add("@countryname", SqlDbType.NVarChar).Value = countryname.Text;
_command.Parameters.Add("@cityname", SqlDbType.NVarChar).Value = cityname.Text;
_command.ExecuteNonQuery();
_connection.Close();
}
这就是问题所在。单击按钮,我看到一个例外:
附加信息:无法将值NULL插入列'CountryID',表'isg_cid.dbo.City';列不允许空值。 INSERT失败。
好的,这很明显 - PK不能为NULL。但是,当我尝试插入Country
表时,我没有必要指定ID(自动增量,自动种子开启),所以
我认为它应该以某种方式在存储过程中完成,并且我打赌这很容易解决 - 对于具有SSMS经验的人来说。对我来说,弄清楚要做什么很麻烦。
感谢您的帮助!
答案 0 :(得分:1)
它不是CountryID
表中的Country
字段,而是CountryID
表中触发错误消息的City
字段。
这是将城市与其国家/地区相关联的外键,并且在插入新城市时逻辑上不能没有值。
因此,一种可能的方法是使用SCOPE_IDENTITY()读取Country表的最后一个IDENTITY值集,并使用此值在City表中设置CountryID。
您需要使用
更改第二个SPCREATE PROCEDURE [dbo].[InsertRecord2]
@countryname nvarchar(64),
@cityname nvarchar(64)
AS
INSERT INTO Country(CountryName) VALUES (@countryname)
INSERT INTO City(CountryID, CityName)
VALUES (SCOPE_IDENTITY(), @cityname)