' CONCAT ' ei ole tunnistettu sisäänrakennettu funktion nimi
On helmikuu 17, 2021 by adminAsiakas ilmoitti käyttävänsä SQL Server 2012: ta, ja toimitimme testikyselyjä testattavaksi ennen lopullista toimitusta:
” CONCAT ”ei ole tunnistettu sisäänrakennettu funktion nimi.
Ymmärrän, että CONCAT()
on uusi sisäänrakennettu -In SQL Server 2012: ssa käyttöön otettu toiminto, joka on hieno ja hyvä, mutta minua on pyydetty palauttamaan muutokseni, jotta tämä 2008R2 olisi yhteensopiva varjolla ”kyselyn suorittavalla käyttäjällä ei ehkä ole Transact-SQL-oikeuksia suorittaa ” Joten todistan vain, että asiakkaalla on todennäköisesti erillinen versio SQL Serveristä DEV: ään kuin heillä PROD: ssä.
En löydä tietoja käyttöoikeudet sisäänrakennetuille skalaariarvoisille funktioille, mutta onko se mahdollista, ja jos saa käyttäjä silti saman virhetekstin?
Kommentit
vastaus
CONCAT
otettiin käyttöön SQL Server 2012: ssa; ei ole mitään tapaa saada sitä toimimaan SQL Server 2008 R2: ssa. -oppaasta :
Ei myöskään ole mahdollista estää sitä epäonnistumasta vuosina 2012+ edes yhteensopivuustasolla. Joten pyydä ihmisiä tarkistamaan SELECT @@VERSION;
molemmissa palvelimissa; huomaat, että missä CONCAT
epäonnistuu, se on < 11. Jotta koodisi olisi yhteensopiva aiempien versioiden kanssa, sinun on käyttää tavallista merkkijonon ketjuoperaattoria (+
). En tiedä, miten tekisit tämän skalaarifunktiolla, ellet ole aina käyttänyt tarkka samaa määrää syötemerkkijonoja ja vaihdat koodisi käyttämään dbo.CONCAT()
-merkkiä CONCAT()
-kohdan sijaan (on tilanteita, joissa sillä on merkitystä, plus jos toiminto tekee mitä tahansa alkuperäistä, et tee, haluat yhdenmukaista käyttäytymistä päivittäessäsi /. Joten en suosittele tätä lähestymistapaa. Saatat myös joutua lisäämään NULL
-käsittelyn ja muita pieniä muutoksia (mahdotonta kertoa, kuinka nykyistä komentosarjaa muutetaan tarkalleen, jos voimme ”t katso se).
Kommentit
- Kiitos, Aaron. Koodia on triviaali muuttaa, koska CONCAT (): ta käytetään vain joidenkin merkkijonojen liittämiseen yhteen ennen SP_ExecuteSQL-dynaamista SQL-kutsua. Halusin vain vahvistaa, ettei ole mitään tapaa kieltää pääsyä CONCAT (): n käyttämiseen SQL Server 2012: ssa.
- @beeks En tiedä mitään ' tapa kieltää käyttäjiltä mahdollisuus käyttää
CONCAT()
, ei. En ' seuraa varsin hyvin, mikä vaikuttaa siihen, mitä sinun on tehtävä, jotta koodi toimisi 2008 R2: lla. Sinun täytyy poistaaCONCAT()
, ei lisätä sitä. - kyllä, ymmärrän kuinka koodista tehdään yhteensopiva 2008 R2: n kanssa, että on triviaali. Kiitos vahvistuksestasi, että tätä toimintoa
DENY
ei voi käyttää. - Huomaa vain, kun vaihdat konsatin + sinä ' ll on varmistettava, että ketjutettavat arvot ovat merkkijonoja, jos sinulla on numeerisia kenttiä, se yrittää lisätä ne (ja epäonnistuu, koska merkkijono ei ole int), joten jos on numerokenttä (tyyppi) tee muista muuntaa / välittää se ensin merkkijonoksi
Vastaa
Voit käyttää ODBC CONCAT -funktiota näin :
SELECT {fn CONCAT("foo ", "test") }
Tässä on ongelma, että tämä toiminto sallii vain kaksi parametria kerrallaan. Joten ellet halua käyttää useampaa kuin kahta tällaista:
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
Saatat ehkä ja käytä vain ”+” -operaattoria.
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;