SQL 2005 - 表值函数编译正常,但选择时在 .. 附近抛出不正确的语法

Posted

技术标签:

【中文标题】SQL 2005 - 表值函数编译正常,但选择时在 .. 附近抛出不正确的语法【英文标题】:SQL 2005 - Table valued function compiles ok but throws Incorrect syntax near .. when selected 【发布时间】:2010-08-28 13:54:37 【问题描述】:

这个表值函数编译ok,

alter function [dbo].[ftsls031nnnHades](@withExpiredEntries smallint ) returns 
@t table( comno     varchar(3), 
        t$cuno      varchar(6),
        t$cpgs      varchar(6),
        t$dile      float,
        t$qanp      float,
        t$stdt      varchar(10),
        t$tdat      varchar(10),
        t$disc      float,
        t$damt      float,
        t$cdis      char(3),
        t$gnpr      float,
        t$refcntd   float,
        t$refcntu   float) as
------------------------------------------------------*/
/*-------------------------------------------------------
declare @withExpiredEntries bit; set @withExpiredEntries =0
declare @t table( comno     varchar(3), 
        t$cuno      varchar(6),
        t$cpgs      varchar(6),
        t$dile      float,
        t$qanp      float,
        t$stdt      varchar(10),
        t$tdat      varchar(10),
        t$disc      float,
        t$damt      float,
        t$cdis      char(3),
        t$gnpr      float,
        t$refcntd   float,
        t$refcntu   float)
------------------------------------------------------*/
Begin
set quoted_identifier off
if (@withExpiredEntries = 0) -- without expired entries
    Begin
        insert @t
        select * 
        from openQuery(Hades ,"select '010' comno, trim(t$cuno) t$cuno,trim(t$cpgs) t$cpgs,t$dile,t$qanp,to_char(t$stdt,'dd Mon yy') t$stdt,to_char(t$tdat,'dd Mon yy') t$tdat,to_char(t$disc,'999.99') t$disc,t$damt,t$cdis,t$gnpr,t$refcntd,t$refcntu from baan.ttdsls031010 where (to_char(t$Tdat,'yyyy-mm-dd') >= To_char(current_date,'yyyy-mm-dd')) and (to_char(t$stdt,'yyyy-mm-dd') <= To_char(current_date,'yyyy-mm-dd')) 
               union all       select '020' comno, trim(t$cuno) t$cuno,trim(t$cpgs) t$cpgs,t$dile,t$qanp,to_char(t$stdt,'dd Mon yy') t$stdt,to_char(t$tdat,'dd Mon yy') t$tdat,to_char(t$disc,'999.99') t$disc,t$damt,t$cdis,t$gnpr,t$refcntd,t$refcntu from baan.ttdsls031020 where (to_char(t$tdAt,'yyyy-mm-dd') >= To_char(current_date,'yyyy-mm-dd')) and (to_char(t$stdt,'yyyy-mm-dd') <= To_char(current_date,'yyyy-mm-dd'))")
    return  
End
    insert @t
    select * 
        from openQuery(Hades ,"select '010' comno, trim(t$cuno) t$cuno,trim(t$cpgs) t$cpgs,t$dile,t$qanp,to_char(t$stdt,'dd Mon yy') t$stdt,to_char(t$tdat,'dd Mon yy') t$tdat,to_char(t$disc,'999.99') t$disc,t$damt,t$cdis,t$gnpr,t$refcntd,t$refcntu from baan.ttdsls031010  
               union all       select '020' comno, trim(t$cuno) t$cuno,trim(t$cpgs) t$cpgs,t$dile,t$qanp,to_char(t$stdt,'dd Mon yy') t$stdt,to_char(t$tdat,'dd Mon yy') t$tdat,to_char(t$disc,'999.99') t$disc,t$damt,t$cdis,t$gnpr,t$refcntd,t$refcntu from baan.ttdsls031020   ")
    return
end

选择时会抛出此错误

消息 102,级别 15,状态 1,行 1 'select '010' comno, trim(t$cuno) t$cuno,trim(t$cpgs) t$cpgs,t$dile,t$qanp,to_char(t$stdt,'dd Mon yy') 附近的语法不正确t$stdt,to_char(t$tdat,'dd'.

【问题讨论】:

【参考方案1】:

将双引号改为单引号,看看会发生什么...

...
..Hades ,'select '010' comno...
...

您还必须将包含的单曲加倍。

当 SET QUOTED_IDENTIFIER 为 ON 时," 分隔对象/列名等。不是字符串。这也是默认设置。

SET QUOTED_IDENTIFIER OFF has no meaning at runtime:它设置在 CREATE/ALTER 时间...这就是为什么您在运行时而不是 CREATE 时间得到错误。 CREATE 顺便编译一下……它是在运行时编译成一个计划的。

【讨论】:

感谢您对 Quoted_identifer 的澄清。我确实更改了 select 语句以相互翻转单引号和双引号..但仍然相同.. TonyP:我的意思是加倍是''不是"

以上是关于SQL 2005 - 表值函数编译正常,但选择时在 .. 附近抛出不正确的语法的主要内容,如果未能解决你的问题,请参考以下文章

sql2005中 表值函数是啥

sqlserver2005 表值函数

通过在 SQL Server 2000 中传递变量参数来加入表值函数

sql server 2012 - 无法授予对多语句表值函数的选择

SQL Server:表值函数与存储过程

在 SQL Server 的视图中使用表值函数