【问题标题】:SQL Server : sp_executesql parameters not workingSQL Server:sp_executesql 参数不起作用
【发布时间】: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 没有报错,但是参数没有发送。

【问题讨论】:

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


【解决方案1】:

感谢 Alex K。问题确实出在 C# 中,但我发现 SQL 没有发出错误信号很奇怪。

正确的调用是(粗体是缺少的部分):

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

【讨论】:

    【解决方案2】:

    这里根本不需要动态 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

    【讨论】:

    • 请仔细阅读帖子,我提到代码是“从 C# ADO.NET 生成的”,这意味着我不能按我的意愿称呼它。谢谢
    • @PacurarStefan 你能分享 c# 代码,这样我们就不会猜测和做出假设了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2011-12-12
    • 1970-01-01
    • 2013-12-19
    • 2012-11-18
    相关资源
    最近更新 更多