2012-10-22 34 views
3

下面的代碼應該採用一個字符串,該字符串可以是或不是逗號分隔的,並將其放入表(#tmpFullanme)第二部分假設返回LIKE/NOT LIKE的所有值,根據輸入內容是否帶有%符號。我得到的錯誤是「多部分標識符」#tmpFullname.Item「不能界。」最好的猜測我是,它可能是超出了範圍?多部分標識符「#tmpFullname.Item」無法綁定「

DROP PROCEDURE uspJudgments; 
GO 
CREATE PROCEDURE uspJudgments 
@fullName varchar(100), @SrchCriteria1 varchar(15), @SrchCriteria2 varchar(15), @qualifier varchar(10) 
AS 
BEGIN 

SELECT * 
INTO #tmpFullname 
FROM dbo.DelimitedSplit8K(@fullName, ',') 

DECLARE @Query NVarChar(1024) 
SET @Query = 'SELECT d.*' + ' FROM defendants_ALL d, #tmpFullname' + 
' WHERE d.combined_name' + ' ' + @qualifier + ' ' + '''' + @SrchCriteria1 + '''' + ' + ' + '''' + #tmpFullname.Item + '''' + ' + ' + '''' + @SrchCriteria2 + '''' 

END 

EXEC sp_executesql @Query 
PRINT(@Query) 

IF OBJECT_ID('#tmpFullname', 'U') IS NOT NULL 
DROP TABLE #tmpFullname 

EXEC uspJudgments @qualifier = 'LIKE', @fullName = 'johnson', @SrchCriteria1 = '%', @SrchCriteria2 = '%' 

無法獲取到打印輸出爲‘由多個部分組成的標識符‘#tmpFullname.Item’無法約束。’如果我將#tmpFullname.Item更改爲'#tmpFullname.Item它會通過並返回任何內容,但它顯示該查詢是正確的,減去該表的問題。

SELECT d.* FROM defendants_ALL d, #tmpFullname WHERE d.combined_name LIKE '%' + '#tmpFullname.Item' + '%' 

請注意,直到我做了這個動態查詢,所以我可以更改語句從LIKE到IN等它工作得很好。

+0

從錯誤消息,它看起來像它的O.K. '#tmpFullname',而不是'#tmpFullname.Item'。嘗試運行'select * from tempdb.sys.columns where object_id = object_id('tempdb ..#mytemptable');'(from [This StackOverflow answer](http://stackoverflow.com/a/756112/978917))和打印結果;那會顯示'#tmpFullname'中的列名。 – ruakh

+0

我知道該表中的字段名稱是Item和Itemnumber。每次運行查詢時我運行SELECT * FROM #tmpFullname。這工作正常,如果它不是動態SQL。如果我只運行它沒有動態LIKE它工作正常。 – korrowan

+0

我知道這就是你的期望;但SQL-Server似乎並不同意你的看法。 (是否有一些原因,你不想運行這個查詢?) – ruakh

回答

5

我設置了一個完整的測試,以獲得正確的腳本,讓你獲得你想要的結果。我也有一個SQL Fiddle顯示這是如何工作的。 注意您將要運行EXECUTE sp_executesql @Query存儲過程裏面

ALTER PROCEDURE uspJudgments @fullName varchar(100) 
    , @SrchCriteria1 varchar(15) 
    , @SrchCriteria2 varchar(15) 
    , @qualifier varchar(10) 
AS 
BEGIN 

    --Simulates your split function 
    SELECT * 
    INTO #tmpFullName 
    FROM 
    (
    SELECT 'firstTest' AS Item 
    UNION ALL SELECT 'secondTest' 
    UNION ALL SELECT 'NotThere' 
    ) AS t; 

    DECLARE @Query NVARCHAR(1024); 
    SELECT @Query = 'SELECT d.* ' 
     + ' FROM defendants_ALL d ' 
     + ' CROSS JOIN #tmpFullName AS t ' 
     + ' WHERE d.combined_name' + ' ' + @qualifier + ' ' 
     + '''' + @SrchCriteria1 + '''' 
     + ' + ' + 't.Item' + ' + ' + '''' + @SrchCriteria2 + ''''; 

    EXECUTE sp_executesql @Query; 

END 

EXECUTE uspJudgments 
@fullName = 'does not matter' 
    , @SrchCriteria1 = '%' 
    , @SrchCriteria2 = '%' 
    , @qualifier = 'LIKE'; 
+0

也沒有運氣。它不會採用我得到的FROM子句:Msg 156,Level 15,State 1,Procedure uspJudgments,Line 59 關鍵字'FROM'附近的語法不正確。 – korrowan

+0

@korrowan,你將SET更改爲SELECT? –

+0

我沒有這樣做,但我只是做了,我得到了同樣的錯誤「多部分標識符」#tmpFullname.Item「無法綁定。」 – korrowan

1

你必須使用tempdb的前綴,在這種情況下

insert into tempdb..#TABLENAME 

set @query = 'select * from tempdb..#TABLENAME' 
+0

同樣的問題。插入行會得到以下消息:忽略數據庫名'tempdb',引用tempdb中的對象。至於第二個我得到相同的錯誤「多部分標識符」tempdb ..#tmpFullname.Item「無法綁定。」 – korrowan

1

做好後,我的最後一個回答我發現了幾件事情.. 當我看着你的程序,你開始與「BEGIN「,接下來在」#tmpFullName「表中插入一個表格,聲明」@Query「變量並創建一個select語句。

之後,你做和「END」後面的邏輯。你做了「sp_executesql」之後,你放棄了這個臨時表,然後你做了EXEC的當前程序。

這個結構並不是所有可讀的,遺憾的告訴你。所以也許你先去那裏。 除了一個奇怪的結構,您在某些動態SQL中使用「#tmpFullName.Item」作爲參數,而在SQL查詢中它自己聲明。所以,你必須做這樣的事情:

SET @Query = 'SELECT d.*' + ' FROM defendants_ALL d, #tmpFullname' + 
    ' WHERE d.combined_name' + ' ' + @qualifier + ' ' + '''' + @SrchCriteria1 + '''' + ' + ' + ' #tmpFullname.Item ' + ' + ' + '''' + @SrchCriteria2 + '''' 

凡「#tmpFullName.Item」駐留insde的代碼,而不是作爲一個參數。但是,再一次,你想在這裏實現什麼?爲了完整地回答這個問題,我們必須知道其他變量是什麼。您的結構是不會告訴我什麼是努力實現..

我真的不能做任何更多的方便......

+0

我正在做的是從一個函數中創建tmp表格,該函數採用逗號分隔的字符串,並將每個字符串放入表格中的一行。然後,我試圖查詢每個表格中的所有內容,並對照第一個和最後一個表格然後我希望能夠使用LIKE,NOT LIKE和%符號等來獲取記錄,這些記錄是基於某人在網頁上選擇的內容,Qualifier是LIKe/NOT LIKE/IN,SearchCriteria是% – korrowan

+0

這就是我的想法!只需要確定。在原來的動態查詢中,您正在使用tmptable OUTSIDE查詢,而其餘的temptable是INSIDE查詢。因此,當您使用我的建議時,應該可以正常工作,據我看到它... –

相關問題