【发布时间】:2017-04-18 16:24:38
【问题描述】:
我有一个 VALID sp_executesql 代码,从 C# ADO.NET 生成,但参数未传递给存储过程(SQL Server 问题)。
这是我使用 SQL Profiler 发现的:
declare @p3 StockSyncType
insert into @p3 values(3, 17594, 73471, 20, 5, 100, N'', N'', N'', N'')
insert into @p3 values(3, 17593, 73470, 20, 5, 100, N'', N'', N'', N'')
exec sp_executesql N'EXECUTE [dbo].[sp_SyncInventory] ',N'@Details [dbo].
[StockSyncType] READONLY',@Details=@p3
这里可以找到表类型和存储过程:
CREATE TYPE [dbo].[StockSyncType] AS TABLE(
[OperationTypeId] [int] NOT NULL,
[Product_ID] [int] NOT NULL,
[ProductAttribute_ID] [int] NOT NULL,
[Location_ID] [int] NOT NULL,
[StockType_ID] [int] NOT NULL,
[Quantity] [decimal](18, 0) NOT NULL,
[RowOrIsle] [nvarchar](10) NULL,
[Bay] [nvarchar](10) NULL,
[Shelf] [nvarchar](10) NULL,
[Bin] [nvarchar](55) NULL
)
GO
CREATE PROCEDURE [dbo].[sp_SyncInventory]
@Details StockSyncType READONLY
AS
BEGIN
SELECT *
FROM @Details
END
请帮忙?!我不明白为什么运行sp_executesql 没有报错,但是参数没有发送。
【问题讨论】:
-
第一个参数应该是
N'EXECUTE [dbo].[sp_SyncInventory] @Details',如果这不是您在某些 C# 代码的 Profiler 跟踪中看到的,那么您需要共享 C# 代码。 -
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本没有前缀!
标签: c# sql-server ado.net sp-executesql