日期:2014-05-18  浏览次数:20552 次

请教:存储过程对象名 'dbo.dt_test' 无效
CREATE procedure [dbo].[dt_test]
(
  @str varchar(1024), --要分割的字符串 
  @split varchar(10) --分隔符号 
)
as
begin 
declare @location int 
declare @start int 
declare @length int 
set @str=ltrim(rtrim(@str)) 
set @location=charindex(@split,@str) 
set @length=1 
while @location<>0 
begin 
set @start=@location+1 
set @location=charindex(@split,@str,@start) 
set @length=@length+1 
end 
return @length 
end
GO




select dbo.dt_test('78,1,2,3',',') 


为什么执行后显示:服务器: 消息 208,级别 16,状态 1,行 1
对象名 'dbo.dt_test' 无效。

请指教,是sql2000

------解决方案--------------------
exec dbo.dt_test '78,1,2,3',','
试试,存储过程的调用一般用exec
------解决方案--------------------
探讨

楼主你可以写个函数,或者在存储过程中价格返回@length的参数 @length int output
执行存储过程用 exec
或者这样
EXEC @return_value = [dbo].[dt_test]
@str = N'78,1,2,3',
@split = N','

SELECT 'Return Value' = @return_value

------解决方案--------------------
楼主创建的是存储过程,不是函数。存储过程的调用时用EXEC或EXECUTE来。
EXEC dbo.dt_test('78,1,2,3',',')
想取出返回值,可以设置返回参数

SQL code

CREATE procedure [dbo].[dt_test]
(
  @str varchar(1024), --要分割的字符串 
  @split varchar(10), --分隔符号 
  @ReturnValues INT OUTPUT
)
as
begin 
declare @location int 
declare @start int 
declare @length int 
set @str=ltrim(rtrim(@str)) 
set @location=charindex(@split,@str) 
set @length=1 
while @location<>0 
begin 
set @start=@location+1 
set @location=charindex(@split,@str,@start) 
set @length=@length+1 
end 
SET @ReturnValues = @length 
end
GO

------解决方案--------------------
这里有个函数可以给你参考一下,也是分字符串的
SQL code
ALTER function [dbo].[f_split](@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(a varchar(100))
--实现split功能 的函数
--date :2005-4-20
--Author :Domino
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>'\'
insert @temp values(@SourceSql)
return
end