2014-11-22 68 views
0

我有這個表Test在SQL Server中的列NameSQL服務器:組與條件及給予的功能

Name 
----- 
a 
a 
a 
c 
c 
b 

我寫此查詢:

select * 
from (select Name, COUNT(*) as cnt 
     from Test 
     group by Name 
     having COUNT(*) > 2) as newTbl 
where dbo.fn_Test(Name) = 1 

dbo.fn_Test一個SQL服務器標量函數:

CREATE FUNCTION [dbo].[fn_Test] 
    (@name nvarchar) 
RETURNS bigint 
AS 
BEGIN 
    DECLARE @count int 

    SET @count = (SELECT TOP 1 COUNT(*) 
        FROM Tbl 
        WHERE Name = @name); 
    return @count; 
END 

從第一個查詢FROM部分是平原,這個選擇得到:

select Name, COUNT(*) as cnt 
from Test 
group by Name 
having COUNT(*) > 2 

輸出:

Name cnt 
-------- 
a 3 

但調試查詢時,輸入到dbo.fn_Test功能,它爲所有名稱工作:

a b c 

所以如何創建選擇以獲得名稱「a」的功能?

+0

「Tbl」表的結構是什麼?它應該是測試而不是功能中的Tbl?還有一個問題:我理解每個語句或SQL對象的作用,但是你想獲得什麼,「一般」在談論上述工作時? – 2014-11-22 14:29:38

+0

Tbl任何表。當我調試我的腳本並通過邏輯輸入函數部分時,我只提供名字'a',但我得到其他名稱。爲什麼?功能內容並不重要。 – 2014-11-22 15:07:41

+0

你可以像更新「dbo.fn_Test(newTbl.Name)= 1」那樣更新where子句並重試嗎? (注意在列名前面加入內聯視圖別名前綴)。 – 2014-11-22 15:28:15

回答

1

插入您先選擇到#T

insert into #t 
select Name, COUNT(*) as cnt 
     from Test 
     group by Name 
     having COUNT(*) > 2) 

,然後用遊標調用FUNC

...select dbo.fn_Test(@cursor) 
+0

謝謝,關注! – 2014-11-23 11:34:47

0

試試這個

Select Name,Count(Name) from test 
Group by Name 
having Count(Name)>2 
0

我找到解決方案。這是我的解決方案。

select Name, COUNT(*) as cnt 
into #tmpTbl 
from Tbl 
group by Name 
having COUNT(*) > 2 


select * 
from #tmpTbl 
where dbo.fn_Test(Name) = 1 

而在fn_Test函數中,我得到了與條件對應的名稱。