'CONCAT' tanınmış bir yerleşik işlev adı değil


24

Bir müşteri, SQL Server 2012'de çalıştıklarını bildirdi ve son bir teslimattan önce test için bazı test sorguları sunduk, ancak:

'CONCAT' tanınmış bir yerleşik işlev adı değil.

Bunun CONCAT()iyi ve iyi olan SQL Server 2012'de tanıtılan yeni bir yerleşik işlev olduğunu anlıyorum , ancak bu 2008R2'yi sorgu yürüten kullanıcının kimliği altında uyumlu hale getirmek için yaptığım değişikliği geri almam istendi "Transact-SQL yürütmek için izinlere sahip." Bu yüzden, sadece istemcimin DEV’de kurulu olan ve SQL’de PROD’de olduğundan farklı bir SQL Server sürümüne sahip olduğunu kanıtlıyorum.

SELECT/EXECUTEDahili skalar değerli işlevler için özel olarak izin vermeyi reddetme hakkında herhangi bir bilgi bulamıyorum , ancak mümkün mü ve eğer öyleyse kullanıcı hala aynı hata metnini alıyor mu?


Konsat işe yaramazsa, o zaman bunu deneyinSELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
Nilachal Sethi

CONCAT ondalık tip concat'ı (ID + '_' + OtherID) destekler, ID int türü olabilir.
Zhang

Eski versiyonlarda bunun yerine şunu kullanın:DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Jack Whittaker

Yanıtlar:


21

CONCATSQL Server 2012'de tanıtıldı; SQL Server 2008 R2'de çalışması için hiçbir yolu yoktur. Gönderen belgeler :

görüntü tanımını buraya girin

Uyumluluk seviyesiyle bile 2012 + 'da başarısızlığa uğramanın bir yolu yoktur. Böylece çalışanlarınızın SELECT @@VERSION;her iki sunucuyu da kontrol etmesini sağlayın ; CONCATBaşarısız olduğu yerlerde <11 olduğunu göreceksiniz. Kodunuzu önceki sürümlerle uyumlu hale getirmek için standart dize birleştirme operatörünü ( +) kullanmanız gerekir . Hep kullanılan sürece, bir skaler fonksiyonu ile bunu nasıl bilmiyorum tam giriş dizeleri aynı sayıda ve kullanmak için kodunuzu değiştirmeniz dbo.CONCAT()yerine CONCAT()(sizin işlevi şey yaparsa orada bu konularda senaryolar azalacak, artı yerel yapmaz, eğer yükseltirseniz / yükseltirseniz tutarlı davranışlar istersiniz). Bu yüzden bu yaklaşımı tavsiye etmem. Ayrıca eklemeniz gerekebilirNULL idare ve diğer küçük değişiklikler (eğer göremesek, mevcut betiğinizi nasıl değiştireceğinizi söylemek imkansız).


Sağol Aaron. CONCAT () yalnızca bir SP_ExecuteSQL dinamik SQL çağrısından önce bazı dizeleri birleştirmek için kullanıldığından kodun değiştirilmesi önemsizdir. Gerçekten sadece SQL Server 2012'de CONCAT () kullanarak erişimi reddetmek için hiçbir yolu olmadığını teyit etmek istedim
bees

1
@ beeks Kullanıcıları kullanma yeteneğini inkar etmenin bir yolunu bilmiyorum CONCAT(), hayır. Yine de, 2008 R2’de kodun çalışması için yapmanız gerekenler ile ilgili ne olduğunu tam olarak takip etmiyorum. Kaldırmanız gerek CONCAT(), eklemelisiniz.
Aaron Bertrand

1
evet, kodu 2008 R2 ile nasıl uyumlu hale getireceğimi biliyorum, bu önemsiz. DENYBu işleve erişemediğinizi onayladığınız için teşekkür ederiz .
bees 15

Sadece, concat + olarak değiştirilirken, birleştirilmiş değerlerin birleştirilmesinden emin olmanız gerekir. Sayısal alanlarınız varsa, bunları eklemeyi deneyecek (ve bir dize olmadığı için başarısız olacaktır). sayısal bir alan (tür) ilk önce bir dizgeye dönüştürdüğünüzden / dönüştürüldüğünüzden emin olun
Ste Bov

3

ODBC CONCAT işlevini şu şekilde kullanabilirsiniz:

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

Bununla ilgili problem, bu fonksiyonun bir seferde sadece iki parametreye izin vermesidir. Bu yüzden ikiden fazla kullanmak istemiyorsanız:

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

'+' Operatörünü de kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.