将存储过程转换为查询(SQL Server Compact)?

时间:2014-10-22 10:42:09

标签: c# sql sql-server sql-server-ce

我正在尝试将以下存储过程转换为查询,以便我可以在SQL Server CE中使用它

USE TestResults
GO

CREATE PROCEDURE uspInsertNewTest
     (@DeviceSerialNumber nvarchar(50), 
      @DeviceType nvarchar(50), 
      @ElapsedTime int) 
AS
BEGIN
     INSERT INTO [TestResults].[dbo].[Tests]([Date], [Device], [DeviceType], [ExecutionTimeMs])
     OUTPUT INSERTED.TestId
     VALUES (GETDATE(), @DeviceSerialNumber, @DeviceType, @ElapsedTime) 
END
GO

从上面的脚本中,我可以理解的是它需要三个输入参数

  1. DeviceSerialNumber
  2. 设备类型
  3. ElapsedTime
  4. 但它会更新表Tests中的5列,包括DateTestId

    由于我无法在SQL Server CE中使用存储过程,因此我将上述脚本转换为字符串查询,

    string queryString = "INSERT INTO Tests ([Date], [Device], [DeviceType], [ExecutionTimeMs]) VALUES (@Date, @DeviceSerialNumber, @DeviceType, @ElapsedTime)"
    

    现在如何将OUTPUT INSERTED.TestId包含在字符串(queryString)中?

    有一个类似的问题here,但它对我的问题没有帮助

    谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用@@IDENTITY返回上次插入的标识值:

string queryString = "INSERT INTO Tests " + 
                  "([Date], [Device], [DeviceType], [ExecutionTimeMs]) " +
                  "VALUES (@Date, @DeviceSerialNumber,@DeviceType, @ElapsedTime); " + 
                  "SELECT @@IDENTITY;"

执行查询时,需要将其设置为使用ExecuteScalar方法返回单个值:

var newIdentity;
// set up the queryString variable & command using the above
newIdentity = cmd.ExecuteScalar();    

这假设列TestId是标识列。

答案 1 :(得分:1)

虽然我接受了Tanner的答案,但我最终还是这样做了,

string queryString = "INSERT INTO Tests " + "([Date], [Device], [DeviceType], [ExecutionTimeMs]) " +
                     "VALUES (@Date, @DeviceSerialNumber,@DeviceType, @ElapsedTime)";
string queryString2 = "SELECT @@IDENTITY";

DbCommand command = factory.CreateCommand ();
command.CommandText = queryString;

// Added Parameters here

command.ExecuteNonQuery ();

command.CommandText = queryString2;
object testId =  command.ExecuteScalar ();

所以我不得不将查询分成两个字符串&使用第一个字符串运行ExecuteNonQuery并使用第二个字符串运行ExecuteScalar