【发布时间】:2017-10-05 13:13:39
【问题描述】:
我发现了一些与此类似的问题,但所有解决方案似乎都与将日期参数传递给 sp_executesql 相关,这不是我正在做的......
我有一个 .NET 应用程序,它使用 SqlConnection 和 SqlCommand 类连接到 SQL 数据库。当我使用 SQL Server Profiler 运行应用程序并监视数据库查询时,我可以看到 .NET 应用程序正在生成以下代码:
exec sp_executesql N'IF object_id(''tempdb..#ParmsInProc'') IS NOT NULL DROP TABLE #ParmsInProc
SELECT o.name AS ProcName, o.object_id, p.name AS ParamName, p.system_type_id, p.user_type_id
INTO #ParmsInProc
FROM sys.objects o
JOIN sys.parameters p
ON o.object_id = p.object_id
JOIN sys.types t
ON t.system_type_id = p.system_type_id AND t.user_type_id = p.user_type_id
WHERE type_desc = ''SQL_STORED_PROCEDURE'' AND o.name = ''@sp''
SELECT *
FROM #ParmsInProc p
LEFT JOIN (
SELECT *
FROM #ParmsInProc
WHERE system_type_id = 56 AND user_type_id = 56
) ints
ON p.system_type_id = ints.system_type_id AND p.user_type_id = ints.user_type_id',N'@sp nvarchar(14)',@sp=N'sp_myProcedure'
如果我在 SSMS 中运行该代码,我不会得到任何结果。但是,如果我复制查询并将参数占位符替换为实际值,我会得到 p>
IF object_id('tempdb..#ParmsInProc') IS NOT NULL DROP TABLE #ParmsInProc
SELECT o.name AS ProcName, o.object_id, p.name AS ParamName, p.system_type_id, p.user_type_id
INTO #ParmsInProc
FROM sys.objects o
JOIN sys.parameters p
ON o.object_id = p.object_id
JOIN sys.types t
ON t.system_type_id = p.system_type_id AND t.user_type_id = p.user_type_id
WHERE type_desc = 'SQL_STORED_PROCEDURE' AND o.name = 'sp_myProcedure'
SELECT *
FROM #ParmsInProc p
LEFT JOIN (
SELECT *
FROM #ParmsInProc
WHERE system_type_id = 56 AND user_type_id = 56
) ints
ON p.system_type_id = ints.system_type_id AND p.user_type_id = ints.user_type_id
如果我运行它,我会得到一个结果(这是我期望的结果)
这可能是什么原因造成的?
【问题讨论】:
-
Declare @sp和Set @sp初始阶段和尝试。 -
我不认为这是问题,但参数是 NVARCHARS 而你的字符串是 VARCHAR
标签: sql-server sql-server-2008-r2 ado.net