'CONCAT'不是公认的内置函数名称。
我知道
CONCAT()
是SQL Server 2012中引入的新内置函数,它很好,但是我被要求将更改回滚到使该2008R2与“执行查询的用户可能没有执行Transact-SQL权限”的幌子兼容。因此,我只是想证明我的观点,即客户端最有可能在DEV中安装的SQL Server版本与在PROD中安装的SQL Server版本不同。我找不到有关专门拒绝
SELECT/EXECUTE
内置权限的任何信息。 -标量值函数中,但是有可能吗,如果可以,用户仍然会收到相同的错误文本吗?#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')}) }
只需使用'+'运算符即可。
评论
如果concat无法正常工作,请尝试此SELECT(c.FirstName +','+ c.LastName)作为FULLNAME FROM Graduatejob c;CONCAT支持十进制类型的concat(ID +'_'+ OtherID),ID可以是int类型。
在旧版本中,请改用此方法:DECLARE @msg VARCHAR(200)='压缩文件已完成。目标大小:'+ @TargetSize +'MB。时间戳记:“ + CURRENT_TIMESTAMP;