sql-server - "Incorrect syntax"在 T-SQL 查询的 SELECT 子句中使用表值函数

标签 sql-server t-sql

我有以下用于分割字符串的表值函数。这工作正常,是从网络上的其他地方抄袭的,我本以为这不是问题的原因,但包含在它相关的情况下:

CREATE FUNCTION dbo.StringSplit (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
  WITH Pieces(pn, start, stop) AS (
    SELECT 1, 1, CHARINDEX(@sep, @s)
    UNION ALL
    SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
    WHERE stop > 0
  )
  SELECT pn,
    SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
  FROM Pieces
)
GO

这将启用以下行:

SELECT * FROM dbo.StringSplit('.', 'this.is.a.string.to.split')

生产

 pn | s
----+--------
 1  | this
 2  | is
 3  | a
 4  | string
 5  | to
 6  | split

My aim in this is to obtain a list of file extensions from a table which contains a large number of filenames. To that end, I used the above table-valued function to split each filename:

SELECT
  doc_id,
  doc_file_name,
  (SELECT TOP 1 s FROM dbo.StringSplit('.', doc_file_name) ORDER BY pn DESC) AS extension
FROM
  ai_docs_core

让 SQL Server Enterprise Manager 检查语法,在包含该函数的行上出现语法错误:

Msg 102, Level 15, State 1, Line 34
Incorrect syntax near 'doc_file_name'.

The following doesn't do what I need (obviously, because it's using a set variable), but it doesn't cause a syntax error:

DECLARE @foo VARCHAR(512) = 'my_filename.doc'
SELECT
  doc_id,
  doc_file_name,
  (SELECT TOP 1 s FROM dbo.StringSplit('.', @foo) ORDER BY pn DESC) AS extension
FROM
  ai_docs_core

所以问题是:为什么使用特定的字段名称作为函数的参数会导致语法错误,如何才能达到我想要的效果?

最佳答案

我猜测数据库设置为兼容模式 80 或更低。

参见sp_dbcmptlevel

这通常是发生在 FROM 子句中的原因

也可以这样写

SELECT
  a.doc_id,
  a.doc_file_name,
  foo.extension 
FROM
  ai_docs_core a
  OUTER APPLY
  (SELECT TOP 1 s AS extension
   FROM dbo.StringSplit('.', a.doc_file_name)
   ORDER BY pn DESC
  ) foo

关于sql-server - "Incorrect syntax"在 T-SQL 查询的 SELECT 子句中使用表值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5103624/

相关文章:

sql - 使用 SQL 拆分 URL 并添加到数据库

SQL 从一列到另一列搜索字符串

sql-server - 创建一个逗号分隔的字符串,其中包含数字 1 到 x,其中 x 是从记录中读取的

t-sql - SQL Azure : Get Table Name on CREATE TABLE TRIGGER

sql-server-2005 - 多父树(或有向图)实现sql server 2005

sql-server-2008 - 在 T-SQL 中解析带有时间偏移的日期时间

sql - 检查 varbinary(max) 列是否为 null 真的很慢

sql - 是否可以从键/值对更新行?

sql - 批量删除行数据

sql-server - 在 SQL SERVER 2008 中从字符串转换日期和/或时间时转换失败