SQL Server: procédure de string de return INITCAP

C'est ce que j'ai fait.

create proc INITCAP(@ssortingng varchar(30)) as begin SET @ssortingng = UPPER(LEFT(@ssortingng,1)) + LOWER(RIGHT(@ssortingng, LEN(@ssortingng) -1)) end declare @lastname varchar set @lastname = exec INITCAP 'MILLER' declare @firstname varchar set @firstname = exec INITCAP 'StEvE' UPDATE Employee SET firstname = @firstname, lastname = @lastname WHERE empID = 7934 

Je continue à recevoir les erreurs:

Msg 156, niveau 15, état 1, procédure INITCAP, ligne 97
Syntaxe incorrecte près du mot-key 'exec'.
Msg 156, niveau 15, état 1, procédure INITCAP, ligne 100
Syntaxe incorrecte près du mot-key 'exec'.

Que dois-je faire? Je veux que la procédure INITCAP fonctionne comme dans Oracle: pour returnner un nom comme: "Steve", "Miller"

Solution # 1 (je n'utiliserais pas cette solution)

Vous pouvez utiliser les parameters OUTPUT ainsi:

 create proc INITCAP(@ssortingng varchar(30) OUTPUT) as begin SET @ssortingng = UPPER(LEFT(@ssortingng,1)) + LOWER(SUBSTRING(@ssortingng, 2, 8000)) end go declare @lastname varchar set @lastname = 'MILLER' exec INITCAP @lastname OUTPUT declare @firstname varchar set @firstname = 'StEvE' exec INITCAP @firstname OUTPUT 

Solution n ° 2 : Au lieu de cela, je choisirais de créer une fonction inline ainsi:

 CREATE FUNCTION dbo.Capitalize1(@ssortingng varchar(30)) RETURNS TABLE AS RETURN SELECT UPPER(LEFT(@ssortingng,1)) + LOWER(SUBSTRING(@ssortingng, 2, 8000)) AS Result; 

Usage:

 UPDATE e SET firstname = cap.Result FROM Employee e CROSS APPLY dbo.Capitalize1(e.firstname) cap; 

Solution n ° 3 : Une autre option pourrait être une fonction scalaire with schemabinding option with schemabinding (pour des raisons de performances):

 CREATE FUNCTION dbo.Capitalize2(@ssortingng varchar(30)) RETURNS VARCHAR(30) WITH SCHEMABINDING AS BEGIN RETURN UPPER(LEFT(@ssortingng,1)) + LOWER(SUBSTRING(@ssortingng, 2, 8000)); END; 

Usage:

 UPDATE Employee SET firstname = dbo.Capitalize2(firstname); 

Avez-vous vraiment besoin d'un Proc stocké pour cela ??? Je ferais quelque chose comme ça un UDF ferait bien le boulot je pense …

 CREATE FUNCTION dbo.udf_SomeFunction (@Ssortingng VARCHAR(30)) RETURNS VARCHAR(30) AS BEGIN DECLARE @rtnSsortingng VARCHAR(30); SET @rtnSsortingng = UPPER(LEFT(@ssortingng,1)) + LOWER(RIGHT(@ssortingng, LEN(@ssortingng) -1)) RETURN(@rtnSsortingng); END; 

Vous pouvez appeler cette fonction dans votre instruction SELECT . Avoir un proc en train de faire le même travail ne vous donne pas cette flexibilité

METTRE À JOUR

 UPDATE Employee SET firstname = dbo.udf_SomeFunction (firstname) , lastname = dbo.udf_SomeFunction (lastname) WHERE empID = 7934 

Vous devez utiliser une fonction pour get ce dont vous avez besoin et utiliser la syntaxe que vous souhaitez pour définir les variables. S'il vous plaît ne pas que vous devez mettre GO entre la création de la fonction et le rest.

 create function INITCAP(@ssortingng varchar(30)) returns varchar(30) as begin return UPPER(LEFT(@ssortingng,1)) + LOWER(RIGHT(@ssortingng, LEN(@ssortingng) -1)) end go declare @lastname varchar set @lastname = dbo.INITCAP('MILLER') declare @firstname varchar set @firstname = dbo.INITCAP('StEvE') UPDATE Employee SET firstname = @firstname, lastname = @lastname WHERE empID = 7934