在 SQL SELECT 语句中未找到 UDF
Posted
技术标签:
【中文标题】在 SQL SELECT 语句中未找到 UDF【英文标题】:UDF Not found in SQL SELECT statement 【发布时间】: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 ...”这样的表格 【参考方案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 提供了解决我问题的替代方案,我将他作为答案。不过,感谢您的帮助!以上是关于在 SQL SELECT 语句中未找到 UDF的主要内容,如果未能解决你的问题,请参考以下文章
视图中未在 select 语句中使用的列会影响 Oracle 中的性能
Sql 语句:在要插入的字段中未指定主键时,插入键更新未按预期工作