日期:2014-05-17  浏览次数:20560 次

sqlserver调用自定义方法的问题
写了一个方法来拆分字符串,方法如下:
ALTER function [dbo].[StringSplit]
    (
      @SourceSql VARCHAR(8000) ,
      @StrSeprate VARCHAR(10)
    )
RETURNS @temp TABLE ( a INT )    
    --实现split功能 的函数,拆分为Int类型    
AS 
    BEGIN    
        DECLARE @i INT    
        SET @SourceSql = RTRIM(LTRIM(@SourceSql))    
        SET @i = CHARINDEX(@StrSeprate, @SourceSql)    
        WHILE @i >= 1 
            BEGIN    
                INSERT  @temp
                VALUES  ( RTRIM(LTRIM(LEFT(@SourceSql, @i - 1))) )    
                SET @SourceSql = SUBSTRING(@SourceSql, @i + 1,
                                           LEN(@SourceSql) - @i)    
                SET @i = CHARINDEX(@StrSeprate, @SourceSql)    
            END    
        IF @SourceSql <> '' 
            INSERT  @temp
            VALUES  ( LTRIM(@SourceSql) )    
        RETURN     
    END 

然后用一个sql语句执行这个方法
SELECT * FROM dbo.StringSplit((SELECT fdaids FROM PointRegulationSet WHERE CommonName='1111221'),',')
其中 fdaids是'111,112,113'
报错:消息 102,级别 15,状态 1,第 1 行'(' 附近有语法错误。消息 102,级别 15,状态 1,第 1 行',' 附近有语法错误。
如果修改sql语句
SELECT * FROM dbo.StringSplit('111,112,113'
,',')
就执行成功。
单独执行SELECT fdaids FROM PointRegulationSet WHERE CommonName='1111221' 也是成功的,
问SELECT * FROM dbo.StringSplit((SELECT fdaids FROM PointRegulationSet WHERE CommonName='1111221'),',')
有什么问题!
谢谢
------解决方案--------------------
SELECT * FROM dbo.StringSplit((SELECT fdaids FROM PointRegulationSet WHERE CommonName='1111221'),',')

語法錯誤,因為函數的變量@SourceSql 是一個VARCHAR類型,而不是一個記錄集類型。