2014-10-22 83 views
1

我想下面的存储过程转换成一个查询,这样我就可以在SQL Server CE将存储过程转换为查询(SQL Server Compact)?

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

,但它会更新表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,但它并不能帮助我的问题

谢谢!

+0

您可以改为使用[SQL Server Express](http://www.microsoft.com/en-gb/server-cloud/products/sql-server-editions/sql-server-express.aspx)。 – Tanner 2014-10-22 10:50:41

+0

是的,那已经可用了,但我正在寻找在SQL CE中提供解决方案。 – SanVEE 2014-10-22 10:52:19

+2

您可以在INSERT后立即使用SELECT @@ IDENTITY来返回TestId,假设这是一个标识列? – 2014-10-22 10:57:17

回答

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是标识列。

+0

我推荐使用**'SCOPE_IDENTITY()'* *而不是其他任何东西来抓取新插入的身份值。 [请参阅此博客文章,了解有关WHY的解释](http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity -of-record /) – 2014-10-22 11:11:29

+0

@marc_s我不确定当范围身份不在存储过程中时是否可以工作,但我会根据您的金牌更新它。 – Tanner 2014-10-22 11:13:20

+0

'SCOPE_IDENTITY' **绝对**在“正常”专用SQL语句中工作 - 完全没有问题... – 2014-10-22 11:14:09

1

虽然我接受坦纳的答案,但我终于实现了这个样子,

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