@@identity 和 return 不起作用(如果您打算一次插入多行,SCOPE_IDENT()、IDENT_CURRENT() 也不起作用)。
您最好的选择是使用 OUTPUT,但我在您的代码中看不到任何 OUTPUT。这是给您的示例(代码部分在 C# 中,但您可以轻松地对其进行转换,例如使用 Telerik 转换器或自己编写 - 有 N 种方法来传递数据,我在此示例中选择了 XML):
生成示例表和过程的SQL代码:
USE [Test];
GO
CREATE TABLE IdentityTest
(
Id INT IDENTITY
NOT NULL
PRIMARY KEY ,
FirstName VARCHAR(20) ,
LastName VARCHAR(20)
);
GO
CREATE PROCEDURE InsertTestData
(
@XML VARCHAR(MAX) ,
@NodeName VARCHAR(1000)
)
AS
BEGIN
DECLARE @myIDTable TABLE ( theID INT );
DECLARE @hDoc INT;
DECLARE @tbl TABLE
(
fName VARCHAR(20) ,
lName VARCHAR(20)
);
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML;
INSERT @tbl
SELECT *
FROM OPENXML(@hDoc, @NodeName, 1) WITH (fName VARCHAR(20), lName VARCHAR(20));
EXEC sp_xml_removedocument @hDoc;
INSERT INTO [IdentityTest] ( [FirstName], [LastName] )
OUTPUT [Inserted].[Id]
INTO @myIDTable
SELECT t.[fName], t.[lName]
FROM @tbl AS t;
SELECT *
FROM @myIDTable AS [mit];
END;
GO
这是使用 SP 并插入多行并取回其 ID 的 C# 代码(可能已返回完整的行数据):
void Main()
{
List<Person> people = new List<Person> {
new Person { FName = "Sam", LName="Jones"},
new Person { FName = "Cetin", LName="Basoz"},
new Person { FName = "John", LName="Doe"},
new Person { FName = "Steven", LName="Smith"},
new Person { FName = "Bob", LName="Carpenter"},
};
for (int i = 0; i < 100; i++)
{
people.Add(new Person
{
FName = string.Format("FName#{0}", i),
LName = string.Format("LName#{0}", i)
});
}
var peopleAsXML = new XElement("People",
from p in people
select new XElement("Person",
new XAttribute("fName", p.FName),
new XAttribute("lName", p.LName)));
string sql = @"InsertTestData";
DataTable result = new DataTable();
using (SqlConnection con = new SqlConnection(@"server=.\SQLExpress2012;Trusted_Connection=yes;Database=Test"))
{
SqlCommand cmd = new SqlCommand(sql, con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@XML", peopleAsXML.ToString());
cmd.Parameters.AddWithValue("@NodeName", "/People/Person");
con.Open();
result.Load(cmd.ExecuteReader());
con.Close();
}
// check top 5 returned
for (int i = 0; i < 5; i++)
{
Console.WriteLine((int)result.Rows[i]["theID"]);
}
}
public class Person
{
public string FName { get; set; }
public string LName { get; set; }
}