【问题标题】:UDF Not found in SQL SELECT statement在 SQL SELECT 语句中未找到 UDF
【发布时间】:2018-01-30 06:37:00
【问题描述】:

我无法理解以下链接中提到的 select UDF 语句:

How to split a comma-separated value to columns

CREATE FUNCTION dbo.Split (
  @InputString                  VARCHAR(500),
  @Delimiter                    VARCHAR(1)
)

RETURNS @Items TABLE (
  Item                          VARCHAR(500)
)

AS
BEGIN
  IF @Delimiter = ' '
  BEGIN
        SET @Delimiter = ','
        SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
  END

  IF (@Delimiter IS NULL OR @Delimiter = '')
        SET @Delimiter = ','

--INSERT INTO @Items VALUES (@Delimiter) -- Diagnostic
--INSERT INTO @Items VALUES (@InputString) -- Diagnostic

  DECLARE @Item           VARCHAR(500)
  DECLARE @ItemList       VARCHAR(500)
  DECLARE @DelimIndex     INT

  SET @ItemList = @InputString
  SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
  WHILE (@DelimIndex != 0)
  BEGIN
        SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
        INSERT INTO @Items VALUES (@Item)

        -- Set @ItemList = @ItemList minus one less item
        SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)-@DelimIndex)
        SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
  END -- End WHILE

  IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString
  BEGIN
        SET @Item = @ItemList
        INSERT INTO @Items VALUES (@Item)
  END

  -- No delimiters were encountered in @InputString, so just return @InputString
  ELSE INSERT INTO @Items VALUES (@InputString)

  RETURN

END -- End Function
GO

我检查了权限,并确保该函数已使用正确的架构创建:

SELECT * FROM INFORMATION_SCHEMA.ROUTINES

但是,当我运行以下命令时遇到了问题:

select dbo.Split(TargetFolderId, ',') from ReportConfig where ReportId = 9

错误:

找不到“dbo”列或用户定义的函数,或者 聚合“dbo.Split”,或者名称不明确。

但我能做到

select * from dbo.Split('stringA,stringB', ',')

会不会是我们俩都用的SSMS版本的区别?

我正在使用 SQL2017 - SSMS v17.4。

【问题讨论】:

  • 这是一个表值函数,它返回一个 TABLE 的结果。它必须用作像“Select * from ...”这样的表格

标签: sql sql-server select user-defined-functions


【解决方案1】:

显然,函数被定义为表值,你不能这样使用它

select dbo.Split(TargetFolderId, ',') from ReportConfig where ReportId = 9

但您可以执行CROSS APPLY 来获得TargetFolderId 拆分值。

select sp.Item from ReportConfig rc
CROSS APPLY dbo.Split(rc.TargetFolderId) AS sp
where rc.ReportId = 9

【讨论】:

  • 谢谢,它就像一个魅力。我会将其标记为答案。
【解决方案2】:

这是你的答案

RETURNS @Items TABLE (
  Item                          VARCHAR(500)
)

在您的代码中,您将返回一个表,因此您必须使用类似这样的函数

Select * FROM dbo.Split('1,2,3,4,5,6',',')

结果

Item
1
2
3
4
5
6

【讨论】:

  • 如前所述,然而,stormcloak 提供了解决我问题的替代方案,我将他作为答案。不过,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2013-10-10
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
相关资源
最近更新 更多