一位客户报告说他们正在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)作为FULLNAME FROM Graduatejob c;

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

在旧版本中,请改用此方法:DECLARE @msg VARCHAR(200)='压缩文件已完成。目标大小:'+ @TargetSize +'MB。时间戳记:“ + CURRENT_TIMESTAMP;

#1 楼

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





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

评论


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

– Beeks
16年2月1日在15:16

@beeks我不知道有什么方法可以拒绝用户使用CONCAT()的能力,不是。但是,我不太了解要使代码在2008 R2上工作需要做什么。您需要删除CONCAT(),而不要添加它。

–亚伦·伯特兰(Aaron Bertrand)
16年2月1日在15:17



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

– Beeks
16年2月1日在15:25

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

– Ste Bov
18年5月2日在7:33

#2 楼


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

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


问题这是因为此功能一次只允许您使用两个参数。因此,除非您想使用两个以上这样的内容:

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


只需使用'+'运算符即可。