2014-03-26 60 views
-1

我想创建一个tsql函数,它将返回一个表作为执行tsql查询的结果。但我总是得到错误。只是想知道下面的代码有什么问题。我创造了分裂给出postcodeidsTSQL函数头疼

ALTER FUNCTION [dbo].[fnGetPostcodeBrowseByIds] 
(
    @PostCodes varchar(1000), 
    @SortBy int 
) 
RETURNS @result TABLE 
(
     postcode int, 
     suburb varchar(100), 
     [state] varchar(3) 
) 
AS 
BEGIN 
    declare @tmp table 
    (
     postcode int, 
     suburb varchar(100), 
     [state] varchar(3) 
    ) 
    declare @query varchar(1000) 
    if @SortBy = 0 
     begin 
      set @query = N' select a.postcodeid as postcode,b.name as 
      suburb,a.state from postcode a inner join suburb b on 
      a.postcodeid = b.postcodeid where a.postcodeid 
      in (select data from 
      dbo.fnSplit(''' + @PostCodes + ''','','')) order by a.postcodeid asc' 
     end 
    else 
     begin 
      set @query = N' select a.postcodeid as postcode,b.name as 
      suburb,a.state from postcode a inner join suburb b on 
      a.postcodeid = b.postcodeid where a.postcodeid 
      in (select data from 
      dbo.fnSplit(''' + @PostCodes + ''','','')) order by b.Name asc' 
     end 
     insert into @result execute (@query) 
    return 
END 

等功能

ALTER FUNCTION [dbo].[fnSplit] 
(
    @String NVARCHAR(4000), 
    @Delimiter NCHAR(1) 
) 
RETURNS TABLE 
AS 
RETURN 
(
    WITH Split(stpos,endpos) 
    AS(
     SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos 
     UNION ALL 
     SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1) 
      FROM Split 
      WHERE endpos > 0 
    ) 
    SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)), 
     'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos) 
    FROM Split 
) 

fnSplit作品找到,但第一个函数没有。

此函数用于根据给定的邮政编码返回邮政编码,郊区名称和州的列表,这是一个分隔字符串。例如:2001,2200,3400等。并应能根据邮政编码本身或郊区名称进行排序。

任何帮助将不胜感激。

欢呼声

+0

是什么问题? –

+2

我们不知道这个功能是做什么的。也许编辑你的“问题”,并添加一些解释,以及一个实际的问题... –

回答

0

使用。如果你想要做的就是更改排序顺序,就没有必要诉诸动态SQL :

ALTER FUNCTION [dbo].[fnGetPostcodeBrowseByIds] 
(
    @PostCodes varchar(1000), 
    @SortBy int 
) 
RETURNS @result TABLE 
(
     postcode int, 
     suburb varchar(100), 
     [state] varchar(3) 
) 
AS 
BEGIN 
    insert into @result (postcode,suburb,state) 
    select a.postcodeid as postcode,b.name as suburb,a.state 
    from postcode a 
      inner join 
     suburb b on a.postcodeid = b.postcodeid 
    where a.postcodeid in (select data from dbo.fnSplit(@PostCodes,',')) 
    order by 
     CASE WHEN @Sort = 0 THEN a.postcodeid END asc, 
     CASE WHEN @Sort <> 0 THEN b.Name END asc 

END 

其中,因为你已经毫无疑问现在意识到,你不能无论如何,使用function

+0

你刚刚救了我的一天Damien..thx –

1

无法从函数执行过程或代码。

这种失败:

insert into @result execute (@query) 

我要补充的是,@tmp表是不是在你的代码