'CONCAT'不是公认的内置函数名称


24

一位客户报告说他们正在SQL Server 2012上运行,我们在最终交付之前交付了一些测试查询以进行测试,但是:

'CONCAT'不是公认的内置函数名称。

我知道这CONCAT()是SQL Server 2012中引入的一个新的内置函数,它很好,但是我被要求回退我的更改以使此2008R2兼容,理由是“执行查询的用户可能无法具有执行Transact-SQL权限。” 因此,我只是想证明我的观点,即客户端最有可能在DEV中安装的SQL Server版本与在PROD中安装的SQL Server版本不同。

我找不到有关专门拒绝SELECT/EXECUTE内置标量值函数的权限的任何信息,但是是否可以,如果这样,用户仍然会收到相同的错误文本吗?


如果CONCAT没有再工作,试试这个SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
Nilachal塞西

CONCAT支持十进制类型的concat(ID +'_'+ OtherID),ID可以是int类型。
张张

在旧版本中,请改用此版本:DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Jack Whittaker

Answers:


21

CONCAT是在SQL Server 2012中引入的;没有办法使其在SQL Server 2008 R2中工作。从文档中

在此处输入图片说明

即使具有兼容级别,也没有办法使其在2012年以后失效。因此,请您的人员检查SELECT @@VERSION;两台服务器;您会发现CONCAT失败的地方是<11。为了使您的代码与早期版本兼容,您需要使用标准的字符串连接运算符(+)。我不知道如何使用标量函数来执行此操作,除非您始终使用完全相同数量的输入字符串,并且更改了要使用的代码,dbo.CONCAT()而不是使用CONCAT()(在某些情况下很重要,此外,如果函数执行了任何操作本机不支持,如果/升级时,您希望行为保持一致)。因此,我不推荐这种方法。您可能还需要添加NULL 处理和其他小的更改(如果看不到,则无法告诉您如何准确更改现有脚本)。


谢谢,亚伦 该代码很容易更改,因为CONCAT()仅用于在SP_ExecuteSQL动态SQL调用之前将一些字符串连接在一起。我真的只是想确认没有办法拒绝在SQL Server 2012中使用CONCAT()的访问
beeks 2016年

1
@beeks我不知道有什么方法可以拒绝用户使用CONCAT(),不是。但是,我不太了解如何使代码在2008 R2上运行需要做什么。您需要删除 CONCAT(),而不是添加它。
亚伦·伯特兰

1
是的,我知道如何使代码与2008 R2兼容,这是微不足道的。感谢您确认无法DENY访问此功能。
beeks '02

只是要注意,当将concat更改为+时,您需要确保要连接的值是以字符串开头的,如果您有任何数字字段,它将尝试将它们相加(并且由于字符串不是int而失败),因此如果有一个数字字段(类型),请确保先将其转换/转换为字符串
Ste Bov

3

您可以像这样使用ODBC CONCAT函数:

SELECT {fn CONCAT('foo ', 'test') }

问题在于此功能一次只允许您使用两个参数。因此,除非您想使用两个以上的对象:

SELECT {fn CONCAT('foo ', {fn CONCAT('test ', 'buddy')}) }

您也可以只使用“ +”运算符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.