Kil*_*ise 3 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 @firstname = exec INITCAP 'StEvE'
UPDATE Employee SET firstname = @firstname, lastname = @lastname WHERE empID = 7934
Run Code Online (Sandbox Code Playgroud)
我不断收到错误:
消息 156,级别 15,状态 1,过程 INITCAP,第 97 行
关键字“exec”附近的语法不正确。
消息 156,级别 15,状态 1,过程 INITCAP,第 100 行
关键字“exec”附近的语法不正确。
我该怎么办?我希望该过程INITCAP像在 Oracle 中一样工作:返回一个名称,如:“Steve”、“Miller”
解决方案#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
Run Code Online (Sandbox Code Playgroud)
解决方案#2:相反,我会选择创建一个内联函数:
CREATE FUNCTION dbo.Capitalize1(@string varchar(30))
RETURNS TABLE
AS
RETURN
SELECT UPPER(LEFT(@string,1)) + LOWER(SUBSTRING(@string, 2, 8000)) AS Result;
Run Code Online (Sandbox Code Playgroud)
用法:
UPDATE e
SET firstname = cap.Result
FROM Employee e
CROSS APPLY dbo.Capitalize1(e.firstname) cap;
Run Code Online (Sandbox Code Playgroud)
解决方案 #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;
Run Code Online (Sandbox Code Playgroud)
用法:
UPDATE Employee
SET firstname = dbo.Capitalize2(firstname);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9008 次 |
| 最近记录: |