SQL Server:sp_executesql参数不起作用

时间:2017-04-18 16:24:38

标签: c# sql-server ado.net sp-executesql

我有一个 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的错误,但是没有发送参数。

2 个答案:

答案 0 :(得分:2)

感谢Alex K.这个问题确实存在于C#中,但我发现SQL并没有发出错误的信号。

正确的电话是(粗体是缺失部分):

exec sp_executesql N'EXECUTE [dbo]。[sp_SyncInventory] ​​ @Details ',N'@ Details [dbo]。[StockSyncType] READONLY',@ Details = @ p3

答案 1 :(得分:0)

你根本不需要动态sql。只需打电话给你的程序。

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'')

EXECUTE [dbo].[sp_SyncInventory] @p3

我会提醒您使用sp_作为前缀不是一个好主意。我不喜欢任何前缀,因为它们往往只是噪音,使编码更加困难。 http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix