【发布时间】:2021-09-02 15:24:23
【问题描述】:
我以前没有使用过 TVP 或存储过程,我希望我能得到一些关于如何在 c# 中检索第一个查询的等效项作为数据集的说明。我创建了一个似乎可以工作的自定义类型和过程,每当我声明一个变量并在 SSMS 中执行存储过程时它就可以工作,我只是不确定如何在代码中复制它。
SELECT ServLoc.ID, Meters.MeterID, MeterHistory.Stuff
FROM ServLoc
INNER JOIN Meters ON ServLoc.ID = Meters.ServLocID
INNER JOIN MeterHistory ON Meters.MeterID = MeterHistory.MeterID
WHERE ServLoc.ID IN (1,2,3...40,000)
CREATE TYPE dbo.ServLocMeters
AS TABLE (ServLocID int NOT NULL)
CREATE PROCEDURE [dbo].[sp_ServLocMeters]
@newServLocMeters ServLocMeters READONLY
AS
SELECT ServLocID, Meters.MeterID, MeterHistory.Stuff
FROM Meters
INNER JOIN MeterHistory ON Meters.MeterID = MeterHistory.MeterID
WHERE ServLocID IN (SELECT ServLocID FROM @newServLocMeters)
ORDER BY ServLocID
declare @table as ServlocMeters
insert into @table values (1)
insert into @table values (2)
insert into @table values (31)
exec sp_servlocmeters @table
【问题讨论】:
-
你读过TVPdocumentation吗?它有 C# 代码示例。
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
明白了,谢谢。是的,我已经查看了文档,但是我一直在努力寻找如何在 c# 中使用带有数据适配器的查询(链接也不正确)@DanGuzman
-
如果您的表类型有一个主键
CREATE TYPE dbo.ServLocMeters AS TABLE (ServLocID int PRIMARY KEY);,您可能会获得更好的性能
标签: c# sql-server tsql stored-procedures