⑴ 如何接收 Store Procere 的传回值
3 种方式:
使用 SELECT 以表格方式传回。
设定 Output Parameter 以参数方式传回。
使用 RETURN 传回 1 个整数型别的资料。
以下列出这 3 种传回方式,在 sql 及 ADO.NET 中接收的方法。
一、使用 SELECT 以表格方式传回
我们先来看第 1 种,这也是我最常用的方式。
Store Procere:
01 IF OBJECT_ID('mysp_QueryData') IS NOT NULL
02 DROP PROCEDURE mysp_QueryData
03 GO
04 CREATE PROCEDURE mysp_QueryData (
05 @id int
06 )
07 AS
08 BEGIN
09 SELECT LastName, FirstName
10 FROM Customer
11 WHERE CustomerID = @id;
12 END
在另一支预储程序中要接收此预储程序传回的资料,方法如下:
1 IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
2 DROP TABLE #tmp
3 GO
4 CREATE TABLE #tmp (lname varchar(30), fname varchar(10));
5 INSERT INTO #tmp EXEC mysp_QueryData '1';
6 SELECT * FROM #tmp;
1~2 行:判断若暂存资料表已存在则进行删除。
4~6 行:先建立暂存资料表,再使用 INSERT INTO 方式写入后即可对暂存资料表操作取值。
C#
01 SqlConnection conn = new SqlConnection(strConn);
02 SqlCommand cmd = new SqlCommand(string.Empty, conn);
03 conn.Open();
04
05 cmd.Parameters.Clear();
06 cmd.CommandType = CommandType.StoredProcere;
07 cmd.CommandText = "mysp_QueryData";
08 cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1;
09
10 SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow);
11
12 if (reader.HasRows)
13 {
14 reader.Read();
15 Console.WriteLine("Last Name:" + reader["LastName"]);
16 Console.WriteLine("First Name:" + reader["FirstName"]);
17 }
18
19 reader.Close();
20 reader.Dispose();
21
22 conn.Close();
23 conn.Dispose();
此例是以 ExecuteReader() 来进行读取,然后配合 SqlDataReader 物件将栏位值读出。
因传回的内容只有 1 个资料集,所以第 10 行在读取时可以使用 CommandBehavior.SingleRow 来接收传回的资料集,可结省资源及增进效率,但要注意,若是传回的内容有 2 个资料集以上,那么使用 CommandBehavior.SingleRow 就无法读到第 2 个以后的资料集内容了。
假设传回内容只有 1 个传回值,或是只要读取传回的第 1 笔资料的第 1 个栏位值,可以使用 ExecuteScalar() 将 LastName 读出,如此上面 10~20 行的程式可改为如下:
1 string strName = Convert.ToString(cmd.ExecuteScalar());
2 Console.WriteLine("Last Name:" + strName);
二、设定 Output Parameter 以参数方式传回
Store Procere:
01 CREATE PROCEDURE mysp_QueryData (
02 @id int,
03 @LastName Varchar(30) output
04 )
05 AS
06 BEGIN
07 SELECT @LastName = LastName
08 FROM Customer
09 WHERE CustomerID = @id;
10 END
关键在第 3 行,在参数后方加上 output 设定为输出参数。
在另一支预储程序中要接收此预储程序传回的输出参数方法如下:
1 DECLARE @lname varchar(30);
2 EXEC mysp_QueryData '1',@lname output;
3 PRINT @lname;
第 2 行:在执行预储程序后方指定参数时,要接收输出的参数设定 output 即可。
C#
01 SqlConnection conn = new SqlConnection(strConn);
02 SqlCommand cmd = new SqlCommand(string.Empty, conn);
03 conn.Open();
04
05 cmd.Parameters.Clear();
06 cmd.CommandType = CommandType.StoredProcere;
07 cmd.CommandText = "mysp_QueryData";
08 cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1;
09
10 SqlParameter lastName = cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 30);
11 lastName.Direction = ParameterDirection.Output;
12
13 cmd.ExecuteNonQuery();
14
15 Console.WriteLine("Last Name:" + lastName.Value);
16
17 conn.Close();
18 conn.Dispose();
第 10 行:建立要接收输出的参数名称资料,参数名称 @LastName 须与预储程序中的参数名称一样。
第 11 行:设定为输出参数。
第 15 行:用 .value 将传回资料取出。
三、使用 RETURN 传回单一数值
Store Procere:
1 CREATE PROCEDURE mysp_InsData (
2 @LastName varchar(30),
3 @FirstName varchar(10)
4 )
5 AS
6 BEGIN
7 INSERT INTO Customer (LastName, FirstName) VALUES (@LastName, @FirstName);
8 RETURN SCOPE_IDENTITY();
9 END
在新增完资料后,使用 RETURN 返回新增资料的识别值。
在另一支预储程序中接收此预储程序传回的值:
1 DECLARE @intRow int;
2 EXEC @intRow = mysp_InsData 'Walter', 'Liao';
3 SELECT @intRow;
C#
01 SqlConnection conn = new SqlConnection(strConn);
02 SqlCommand cmd = new SqlCommand(string.Empty, conn);
03 conn.Open();
04
05 cmd.Parameters.Clear();
06 cmd.CommandType = CommandType.StoredProcere;
07 cmd.CommandText = "mysp_InsData";
08 cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 30).Value = "Walter";
09 cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 10).Value = "Liao";
10
11 SqlParameter retID = cmd.Parameters.Add("@ReturnValue", SqlDbType.Int);
12 retID.Direction = ParameterDirection.ReturnValue;
13
14 try
15 {
16 cmd.ExecuteNonQuery();
17 }
18 catch (Exception ex)
19 {
20 //当新增资料时若发生错误,可撰写程式将错误讯息记录下来
21 //InsErrorLog("mysp_InsData", ex.Message);
22 }
23
24 Console.WriteLine("Return Value:" + retID.Value);
25
26 conn.Close();
27 conn.Dispose();
第 11 行:建立要接收 RETURN 的参数,参数名称 @ReturnValue 可自定。
第 12 行:将参数设定为 Return Value。
第 24 行:用 .value 将传回资料取出。
⑵ SQL数据库中删除数据提示错误“Could not find stored procere”
实现级联删除的sqlserver自带存储过程被破坏了,重新安装sqlserver吧
⑶ 何谓store procere该如何使用
正确写的话应该是stored procere
中文翻成预储程序
简单的讲,就是资料库的副程式
不过大部分的情况是...
遇到一件要处理资料的问题时
DBA喜欢写stored procere
Programmer喜欢在程式处理 XD
很难界定哪种是好或不好
下面有简单的教学
http://msdn.microsoft.com/zh-tw/library/ms187926(SQL.90).aspx
⑷ 关于SQL 更新stored procere存储过程
ALTER PROCEDURE proc_name
@Value Varchar(10)
AS
DECLARE @TempValue AS Varchar(10)
DECLARE @TempTable AS Table (Number Varchar(20))
BEGIN
SET @TempValue = @Value + CAST((YEAR(GETDATE( ))+1) AS Char(4))
INSERT INTO @TempTable (Number) VALUES (@TempValue)
SELECT * FROM @TempTable
END
-- 原来的存储过程是取当前年份来做处理的,所以year(getdate())+1就是2012了
⑸ sqlserver怎样备份store procere
使用xp_cmdshell方法之前必须先开启对应的服务器配置选项,查询系统中每个服务器范围的配置选项值使用以下语句。
⑹ 如何打开sql2008加密的store proceres
Create PROCEDURE [dbo].[sp_windbidecrypt]
(@procere sysname = NULL, @revfl int = 1)
AS
/***********************************************************
原作者:王成辉翻译整理
连接sqlcmd语法:
sqlcmd -A -d databasename -o c:\a.txt
调用形式为:
先运行cmd
执行 :
sqlcmd -A -d gzzywst -o c:\a.txt
注意: -A A一定要大写,-d 后面是要进入的数据库 -o 是文件输出路径及文件名。本方法为连接本机SQL2008 远程登录的时候语法更复杂一些,需要服务器IP 登录用户 及密码
第二步:
输入
exec sp_windbidecrypt 'Ts_b_InsertBillDetailDraft',0
再输入
go
以后回车执行接触会跳行,跳行无错误显示,存储过程即解密成功,可以在输出路径下查看了。
或者在sql manament studio中新建--数据库引擎查询:admin:192.168.1.0然后执行语句就可以了
---------------------------------------------------------------
如果第二个参数使用1的话,会给出该存储过程的一些提示。
--版本4.0 修正存储过程过长解密出来是空白的问题
这个版本已经完全可以解密出sql2008下面的存储过程了
**************************************************************/
SET NOCOUNT ON
IF @revfl = 1
BEGIN
PRINT '警告:该存储过程会删除并重建原始的存储过程。'
PRINT ' 在运行该存储过程之前确保你的数据库有一个备份。'
PRINT ' 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。'
PRINT ' 为了运行这个存储过程,将参数@refl的值更改为0。'
RETURN 0
END
DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@procNameLength int
select @maxColID = max(subobjid) FROM
sys.sysobjvalues WHERE objid = object_id(@procere)
--select @maxColID as 'Rows in sys.sysobjvalues'
select @procNameLength = datalength(@procere) + 29
DECLARE @real_01 nvarchar(max)
DECLARE @fake_01 nvarchar(max)
DECLARE @fake_encrypt_01 nvarchar(max)
DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max)
declare @objtype varchar(2),@ParentName nvarchar(max)
select @real_decrypt_01a = ''
--提取对象的类型如是存储过程还是函数,如果是触发器,还要得到其父对象的名称
select @objtype=type,@parentname=object_name(parent_object_id)
from sys.objects where [object_id]=object_id(@procere)
-- 从sys.sysobjvalues里提出加密的imageval记录
SET @real_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =
object_id(@procere) and valclass = 1 order by subobjid)
--创建一个临时表
create table #output ( [ident] [int] IDENTITY (1, 1) NOT NULL ,
[real_decrypt] NVARCHAR(MAX) )
--开始一个事务,稍后回滚
BEGIN TRAN
--更改原始的存储过程,用短横线替换
if @objtype='P'
SET @fake_01='ALTER PROCEDURE '+ @procere +' WITH ENCRYPTION AS select 1
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='FN'
SET @fake_01='ALTER FUNCTION '+ @procere +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END'
else if @objtype='V'
SET @fake_01='ALTER view '+ @procere +' WITH ENCRYPTION AS select 1 as col
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='TR'
SET @fake_01='ALTER trigger '+ @procere +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
EXECUTE (@fake_01)
--从sys.sysobjvalues里提出加密的假的
SET @fake_encrypt_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =
object_id(@procere) and valclass = 1 order by subobjid )
if @objtype='P'
SET @fake_01='Create PROCEDURE '+ @procere +' WITH ENCRYPTION AS select 1
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='FN'
SET @fake_01='CREATE FUNCTION '+ @procere +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END'
else if @objtype='V'
SET @fake_01='Create view '+ @procere +' WITH ENCRYPTION AS select 1 as col
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='TR'
SET @fake_01='Create trigger '+ @procere +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
--开始计数
SET @intProcSpace=1
--使用字符填充临时变量
SET @real_decrypt_01 = replicate(cast('A'as nvarchar(max)), (datalength(@real_01) /2 ))
--循环设置每一个变量,创建真正的变量
--每次一个字节
SET @intProcSpace=1
--如有必要,遍历每个@real_xx变量并解密
WHILE @intProcSpace<=(datalength(@real_01)/2)
BEGIN
--真的和假的和加密的假的进行异或处理
SET @real_decrypt_01 = stuff(@real_decrypt_01, @intProcSpace, 1,
NCHAR(UNICODE(substring(@real_01, @intProcSpace, 1)) ^
(UNICODE(substring(@fake_01, @intProcSpace, 1)) ^
UNICODE(substring(@fake_encrypt_01, @intProcSpace, 1)))))
SET @intProcSpace=@intProcSpace+1
END
--通过sp_helptext逻辑向表#output里插入变量
insert #output (real_decrypt) select @real_decrypt_01
--select real_decrypt AS '#output chek' from #output --测试
-- -------------------------------------
--开始从sp_helptext提取
-- -------------------------------------
declare @dbname sysname
,@BlankSpaceAdded int
,@BasePos int
,@CurrentPos int
,@TextLength int
,@LineId int
,@AddOnLen int
,@LFCR int --回车换行的长度
,@DefinedLength int
,@SyscomText nvarchar(max)
,@Line nvarchar(255)
Select @DefinedLength = 255
SELECT @BlankSpaceAdded = 0 --跟踪行结束的空格。注意Len函数忽略了多余的空格
CREATE TABLE #CommentText
(LineId int
,Text nvarchar(255) collate database_default)
--使用#output代替sys.sysobjvalues
DECLARE ms_crs_syscom CURSOR LOCAL
FOR SELECT real_decrypt from #output
ORDER BY ident
FOR READ ONLY
--获取文本
SELECT @LFCR = 2
SELECT @LineId = 1
OPEN ms_crs_syscom
FETCH NEXT FROM ms_crs_syscom into @SyscomText
WHILE @@fetch_status >= 0
BEGIN
SELECT @BasePos = 1
SELECT @CurrentPos = 1
SELECT @TextLength = LEN(@SyscomText)
WHILE @CurrentPos != 0
BEGIN
--通过回车查找行的结束
SELECT @CurrentPos = CHARINDEX(char(13)+char(10), @SyscomText,
@BasePos)
--如果找到回车
IF @CurrentPos != 0
BEGIN
--如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +
@CurrentPos-@BasePos + @LFCR) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength-(isnull(LEN(@Line),0) +
@BlankSpaceAdded)
INSERT #CommentText VALUES
( @LineId,
isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,
@BasePos, @AddOnLen), N''))
SELECT @Line = NULL, @LineId = @LineId + 1,
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0
END
SELECT @Line = isnull(@Line, N'') +
isnull(SUBSTRING(@SyscomText, @BasePos, @CurrentPos-@BasePos + @LFCR), N'')
SELECT @BasePos = @CurrentPos+2
INSERT #CommentText VALUES( @LineId, @Line )
SELECT @LineId = @LineId + 1
SELECT @Line = NULL
END
ELSE
--如果回车没找到
BEGIN
IF @BasePos <= @TextLength
BEGIN
--如果@Lines长度的新值大于定义的长度
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +
@TextLength-@BasePos+1 ) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength -
(isnull(LEN(@Line),0) + @BlankSpaceAdded)
INSERT #CommentText VALUES
( @LineId,
isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,
@BasePos, @AddOnLen), N''))
SELECT @Line = NULL, @LineId = @LineId + 1,
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0
END
SELECT @Line = isnull(@Line, N'') +
isnull(SUBSTRING(@SyscomText, @BasePos, @TextLength-@BasePos+1 ), N'')
if LEN(@Line) < @DefinedLength and charindex(' ',
@SyscomText, @TextLength+1 ) > 0
BEGIN
SELECT @Line = @Line + ' ', @BlankSpaceAdded = 1
END
END
END
END
FETCH NEXT FROM ms_crs_syscom into @SyscomText
END
IF @Line is NOT NULL
INSERT #CommentText VALUES( @LineId, @Line )
select Text from #CommentText order by LineId
CLOSE ms_crs_syscom
DEALLOCATE ms_crs_syscom
DROP TABLE #CommentText
-- -------------------------------------
--结束从sp_helptext提取
-- -------------------------------------
--删除用短横线创建的存储过程并重建原始的存储过程
ROLLBACK TRAN
DROP TABLE #output
go
⑺ 怎么解决
stored proceres 是系统自带的或用户自己编写的,由SQL语句组成的过程 External stored procere 是调用外部DLL来创建的过程。
⑻ 什么是sql中的stored proceres
stored proceres 就是存储过程,就是已经命名的代码段。
这个和一般编程语言中的方法(函数)类似,可以实现循环、IF判断、异常处理等等。
⑼ 在DB2中创建Store procere时出线的错误SQL0440N怎么解决
检查看你是不是改动了表里的某列列名,及关联的项.导致数据读取时,某些数据读不出来而出错!
⑽ sql语句里怎麽调用storeprocere
sql语句中只能执行函数,不能执行存储过程。比如 select 函数(参数) from al 你说的是在Navicat工具里执行存储过程吗? 试试这个 declareid varcahr2(100);call CALLCENTER_CHECK_CALLERID(mobile,id);end;