Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:返回字符串过程INITCAP_Sql_Sql Server_Stored Procedures - Fatal编程技术网

SQL Server:返回字符串过程INITCAP

SQL Server:返回字符串过程INITCAP,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,这就是我所做的 create proc INITCAP(@string varchar(30)) as begin SET @string = UPPER(LEFT(@string,1)) + LOWER(RIGHT(@string, LEN(@string) -1)) end declare @lastname varchar set @lastname = exec INITCAP 'MILLER' declare @firstname varchar set @firstnam

这就是我所做的

create proc INITCAP(@string varchar(30))
as
begin
    SET @string = UPPER(LEFT(@string,1)) + LOWER(RIGHT(@string, LEN(@string) -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
我不断发现错误:

Msg 156,15级,状态1,程序初始CAP,第97行 关键字“exec”附近的语法不正确。 Msg 156,15级,状态1,程序初始CAP,第100行 关键字“exec”附近的语法不正确


我该怎么办?我希望INITCAP过程像在Oracle中一样工作:返回一个名称,如:Steve,Miller

您真的需要一个存储过程吗???我会做这样的事情一个UDF会做的很好我想

CREATE FUNCTION dbo.udf_SomeFunction (@String VARCHAR(30))
RETURNS VARCHAR(30)
AS
BEGIN
     DECLARE @rtnString VARCHAR(30);
    SET @rtnString = UPPER(LEFT(@string,1)) + LOWER(RIGHT(@string, LEN(@string) -1))
     RETURN(@rtnString);
END;
您可以在SELECT语句中调用此函数,让一个进程执行相同的任务并不能提供这种灵活性

更新

解决方案1我不会用这个解决方案

因此,您可以使用输出参数:

create proc INITCAP(@string varchar(30) OUTPUT)
as
begin
    SET @string = UPPER(LEFT(@string,1)) + LOWER(SUBSTRING(@string, 2, 8000))
end
go 

declare @lastname varchar
set @lastname = 'MILLER'
exec INITCAP @lastname OUTPUT

declare @firstname varchar
set @firstname = 'StEvE'
exec INITCAP @firstname OUTPUT
解决方案2:相反,我会选择创建一个内联函数,因此:

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

UPDATE e 
SET firstname = cap.Result
FROM Employee e
CROSS APPLY dbo.Capitalize1(e.firstname) cap;
UPDATE Employee
SET firstname = dbo.Capitalize2(firstname);
解决方案3:出于性能原因,另一个选项可以是带有schemabinding选项的标量函数:

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

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

您应该使用函数来实现所需的功能,并在设置变量时使用所需的语法。请不要担心,您必须在函数创建和其他操作之间设置过道

create function INITCAP(@string varchar(30))
returns varchar(30)
as
begin
    return UPPER(LEFT(@string,1)) + LOWER(RIGHT(@string, LEN(@string) -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

解决方案2应为您提供最佳性能,尤其是当您必须更新多人时。是的,尝试使用函数,但未获得该函数。现在,正如你告诉我的,我肯定会把它作为一个函数来使用!谢谢我仍然收到一个错误:“INITCAP”不是可识别的内置函数名。使用3解决方案将func的名称更改为INITCAPNote:而不是LOWERRIGHT@string, LEN@string-1我用过LOWERSUBSTRING@string,2,8000因为LEN函数示例:尝试选择LEN'A'为什么过程INITCAP有5行以上?它应该以end结尾,就在go之前,我添加了go now的行。将创建过程替换为alter procedure,从alter procedure INITCAP选择此SP的源以。。。结束进入SSMS,然后单击执行F5按钮。感谢您的回答!