这就是我所做的。
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,Level 15,State 1,Procedure INITCAP,97行
关键字'exec'附近的语法不正确。
信息156,第15级,状态1,程序INITCAP,第100行
关键字'exec'附近的语法不正确。
我该怎么办?我希望程序INITCAP
像在Oracle中一样工作:返回一个名称:“Steve”,“Miller”
答案 0 :(得分:4)
解决方案#1 (我不会使用此解决方案)
您可以使用OUTPUT参数:
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;
解决方案#3 :另一个选项可能是标量函数with 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 Employee
SET firstname = dbo.Capitalize2(firstname);
答案 1 :(得分:1)
你真的需要一个存储的Proc吗?我会做这样的事情,我认为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 语句中调用此函数,让proc执行相同的工作并不能为您提供这种灵活性
<强>更新强>
UPDATE Employee
SET firstname = dbo.udf_SomeFunction (firstname)
, lastname = dbo.udf_SomeFunction (lastname)
WHERE empID = 7934
答案 2 :(得分:1)
您应该使用函数来实现所需的功能,并使用您在设置变量时使用的语法。请注意,您必须在函数创建和其他函数之间放置GO
。
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