2017-10-05 63 views
1

我發現這幾個類似的問題,但所有的解決方案似乎都與傳遞日期參數以使用sp_executesql這是我做的不算什麼......sp_execute SQL給予不同的結果,以原始查詢

我有一個使用SqlConnection和SqlCommand類連接到SQL數據庫的.NET應用程序。當我運行應用程序並監視使用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的代碼,我沒有得到任何結果。但是,如果我複製出來的查詢,並與實際值替換參數佔位符,我得到

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 

,如果我跑,我得到一個結果(這是我所期望的結果)

什麼可能造成這種情況?

+0

'聲明@ sp'和'設置@ sp'初始階段並嘗試。 –

+0

我不認爲這是問題,但參數是NVARCHARS,而你的字符串是VARCHAR –

回答

1

如果您嘗試「調試」您的初始查詢,您將看到@sp正在作爲過程名稱傳遞,而不是您的參數的實際值。

您可以通過編寫看到以下內容:

declare @spname nvarchar(100) = 'my_storedproc'; 
declare @sql nvarchar(max) = ' 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;' 
print @sql 

正在生成以下:

enter image description here

你需要做的是什麼,只是把它作爲一個參數,無需要報價。 我修改了一點查詢只是爲了能夠打印出來,通過存儲SQL查詢到一個變量,但你當然可以執行它,你有它,內聯:

declare @spname nvarchar(100) = 'my_storedproc'; 
declare @sql nvarchar(max) = ' 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;' 
print @sql 
exec sp_executesql @sql, N'@sp nvarchar(100)', @sp = @spname 

這將成功執行,你在消息標籤下看到打印的sql查詢:)

+1

感謝你。就像一對錯位的撇號一樣簡單...... – SEarle1986

+0

不客氣! :) –