问题解决了,谢谢 vivianfdlpw() ,真的很感谢,我承诺给你150分,*^O^*...... 书到用时方很少啊!我也经常用SET NOCOUNT ON,但是就是没有想到用Provider=SQLOLEDB.1是返回一个计数列影响,而没有返回我SELECT出来的集合! 贴出我的SP,其实很简单,本来用不着用SP,但是我觉得在前台产生一个序号非常慢,所以就用SP:if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CE_LIST_PRT]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[CE_LIST_PRT] GOSET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO --SET NOCOUNT ON /*写在SP外面没有用哦,这个不属于SP的CODE,只是在我编写,产生SP的这个SESSION有效*/ GO create proc dbo.[CE_LIST_PRT] as SET NOCOUNT ON --写在SP里面 SELECT IDENTITY(INT,1,1) AS PR_SN,PR_NO,PR_NAM,PR_TYPE INTO #TT FROM CE_PRT Order By PR_NO select * from #TT ; RETURN 0GO
问题已经想到: 有一个公证测试系统,功能:内部申请测试公司测试产品, 以得到一个以第三方标准对产品的质量鉴定有一个表CE_TESTFEE:測試項目費用維護 索引键:CTF_TENO + CTF_CPNO CTF_TENO 測試項目代號 CTF_CPNO 公司代號 CTF_FEE費用 CTF_CCUNO 幣別代號 CTF_CUSER修改人員 CTF_CDAT 修改日期 CTF_DEFAULT 是否默認值另外一个表CE_CET_D:公證測試表項目明細資料 CED_T_CODE 測試項目代號 CET_TEST_COMP:測試公司 CED_UP:产生费用 CED_CUR:币别 ....现在要做的是,CE_CET_D表的CED_T_CODE已经写入, 但是CET_TEST_COMP,CED_UP,CED_CUR为空, 假如CE_TESTFEE表如此设计,一个测试项目对应多个测试公司, 有多笔资料,对于同一个测试项目,有多笔资料设为默认值(即CTF_DEFAULT为1:TRUE) 那么我在UPDATE CE_CET_D表的时候,我要带入默认值, 并且要每个测试项目带入第一个DEFAULT,那么我要如何写呢?我用: UPDATE D SET D.CET_TEST_COMP= T.CTF_CPNO D. CED_UP=T.CTF_FEE D. CED_CUR=T.CTF_CCUNO FROM CE_CET_D D,CE_TESTFEE T WHERE D.CED_T_CODE = T.CTF_TENO AND T.CTF_DEFAULT = 1--我这样写,不是每个都带入第一个TOP 1的DEFAULT值, 他是遇到第一次就第一个DEFAULT值,第二次就带入第二个DEFAULT值! 你有办法做到吗?我有个多个DEFAULT值, 但是你必须对每个测试项目带入第一个DEFAULT值, 按照测试公司费用升序,费用最大的排在前面我已经做了修改,就是一个测试项目只能有一个DEFAULT, 目前系统已经满足要求,不过我当初这种假设可以做到吗?只要帮我解决的,都给分,目前本人可用分不多,一个帖子不能给太多分,欠分的,我可以给的时候一定给!!3Q!
你应该再加个连接条件UPDATE D SET D.CET_TEST_COMP= T.CTF_CPNO ,D. CED_UP=T.CTF_FEE ,D. CED_CUR=T.CTF_CCUNO FROM CE_CET_D D JOIN CE_TESTFEE T WHERE D.CED_T_CODE = T.CTF_TENO --项目字段关联 AND T.CTF_CPNO=D.CET_TEST_COMP --公司字段关联 AND T.CTF_DEFAULT = 1
你应该再加个连接条件UPDATE D SET D.CET_TEST_COMP= T.CTF_CPNO ,D. CED_UP=T.CTF_FEE ,D. CED_CUR=T.CTF_CCUNO FROM CE_CET_D D JOIN CE_TESTFEE T ON D.CED_T_CODE = T.CTF_TENO --项目字段关联 AND T.CTF_CPNO=D.CET_TEST_COMP --公司字段关联 AND T.CTF_DEFAULT = 1
--大致写了一下,具体细节可以要做点小修改 --而且,我对你的原意有些不解 --例如:"按照测试公司费用升序,费用最大的排在前面" UPDATE CE_CET_D SET CE_CET_D.CET_TEST_COMP= tt.CTF_CPNO ,CE_CET_D.CED_UP=tt.CTF_FEE ,CE_CET_D.CED_CUR=tt.CTF_CCUNO FROM (select top 1 t1.* from CE_TESTFEE as t1 join CE_CET_D as t2 on t1.CTF_TENO=t2.CED_T_CODE where t1.CTF_DEFAULT = 1 order by t1.CTF_FEE desc)tt where tt.CTF_TENO=CE_CET_D.CED_T_CODE
按照测试公司费用升序,费用最大的排在前面 ===============> top 1 应该是费用最少的吧,别人帮你们测试,是你们付费的? 如果CE_CET_D表只保存每个项目的最少费用纪录:UPDATE D SET D.CET_TEST_COMP= T.CTF_CPNO ,D. CED_UP=T.CTF_FEE ,D. CED_CUR=T.CTF_CCUNO FROM CE_CET_D D JOIN CE_TESTFEE T ON D.CED_T_CODE = T.CTF_TENO --项目字段关联 AND T.CTF_DEFAULT = 1 AND T.CTF_FEE=(select min(CTF_FEE) from CE_TESTFEE where CTF_TENO=T.CTF_TENO)
贴出我的SP,其实很简单,本来用不着用SP,但是我觉得在前台产生一个序号非常慢,所以就用SP:if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CE_LIST_PRT]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CE_LIST_PRT]
GOSET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
--SET NOCOUNT ON /*写在SP外面没有用哦,这个不属于SP的CODE,只是在我编写,产生SP的这个SESSION有效*/
GO
create proc dbo.[CE_LIST_PRT]
as
SET NOCOUNT ON --写在SP里面
SELECT IDENTITY(INT,1,1) AS PR_SN,PR_NO,PR_NAM,PR_TYPE INTO #TT
FROM CE_PRT Order By PR_NO
select * from #TT ;
RETURN 0GO
顶一下, 顺便蹭点分。
有一个公证测试系统,功能:内部申请测试公司测试产品,
以得到一个以第三方标准对产品的质量鉴定有一个表CE_TESTFEE:測試項目費用維護
索引键:CTF_TENO + CTF_CPNO
CTF_TENO 測試項目代號
CTF_CPNO 公司代號
CTF_FEE費用
CTF_CCUNO 幣別代號
CTF_CUSER修改人員
CTF_CDAT 修改日期
CTF_DEFAULT 是否默認值另外一个表CE_CET_D:公證測試表項目明細資料
CED_T_CODE 測試項目代號
CET_TEST_COMP:測試公司
CED_UP:产生费用
CED_CUR:币别
....现在要做的是,CE_CET_D表的CED_T_CODE已经写入,
但是CET_TEST_COMP,CED_UP,CED_CUR为空,
假如CE_TESTFEE表如此设计,一个测试项目对应多个测试公司,
有多笔资料,对于同一个测试项目,有多笔资料设为默认值(即CTF_DEFAULT为1:TRUE)
那么我在UPDATE CE_CET_D表的时候,我要带入默认值,
并且要每个测试项目带入第一个DEFAULT,那么我要如何写呢?我用:
UPDATE D
SET D.CET_TEST_COMP= T.CTF_CPNO
D. CED_UP=T.CTF_FEE
D. CED_CUR=T.CTF_CCUNO
FROM CE_CET_D D,CE_TESTFEE T
WHERE D.CED_T_CODE = T.CTF_TENO
AND T.CTF_DEFAULT = 1--我这样写,不是每个都带入第一个TOP 1的DEFAULT值,
他是遇到第一次就第一个DEFAULT值,第二次就带入第二个DEFAULT值!
你有办法做到吗?我有个多个DEFAULT值,
但是你必须对每个测试项目带入第一个DEFAULT值,
按照测试公司费用升序,费用最大的排在前面我已经做了修改,就是一个测试项目只能有一个DEFAULT,
目前系统已经满足要求,不过我当初这种假设可以做到吗?只要帮我解决的,都给分,目前本人可用分不多,一个帖子不能给太多分,欠分的,我可以给的时候一定给!!3Q!
SET D.CET_TEST_COMP= T.CTF_CPNO
,D. CED_UP=T.CTF_FEE
,D. CED_CUR=T.CTF_CCUNO
FROM CE_CET_D D
JOIN CE_TESTFEE T
WHERE D.CED_T_CODE = T.CTF_TENO --项目字段关联
AND T.CTF_CPNO=D.CET_TEST_COMP --公司字段关联
AND T.CTF_DEFAULT = 1
SET D.CET_TEST_COMP= T.CTF_CPNO
,D. CED_UP=T.CTF_FEE
,D. CED_CUR=T.CTF_CCUNO
FROM CE_CET_D D
JOIN CE_TESTFEE T
ON D.CED_T_CODE = T.CTF_TENO --项目字段关联
AND T.CTF_CPNO=D.CET_TEST_COMP --公司字段关联
AND T.CTF_DEFAULT = 1
没有T.CTF_CPNO=D.CET_TEST_COMP --公司字段关联
的条件,实际情况是这样,先是有公司送样品给我们,于是我们品管部的QA人员按需申请测试样品,于是便有CE_CET_D这个表的测试项目的产生,但是CET_TEST_COMP,CED_UP,CED_CUR为空,因为不确定给请那个公司(需要国际认证,所以会请公证行的公司)来帮我们测试,然后我们有维护一个表
CE_TESTFEE,里面记录测试项目,测试公司,费用,币别,是否为default,
假如我设计表CE_TESTFEE,某些测试项目可以有多笔default值,如果用户需要带入默认值,就update表CET_TEST_COMP,CED_UP,CED_CUR,这个带入是default为true,假如一个测试项目default可以有多笔,不同的公司,那么我每次要带入的是按公司代号升序,排在最前面的那一笔!!!所以就是测试公司还不知道,这个是要带入的东西!
就是要货比三家,设定default值,然后选择top 1
--而且,我对你的原意有些不解
--例如:"按照测试公司费用升序,费用最大的排在前面"
UPDATE CE_CET_D
SET CE_CET_D.CET_TEST_COMP= tt.CTF_CPNO
,CE_CET_D.CED_UP=tt.CTF_FEE
,CE_CET_D.CED_CUR=tt.CTF_CCUNO
FROM (select top 1 t1.*
from CE_TESTFEE as t1 join CE_CET_D as t2
on t1.CTF_TENO=t2.CED_T_CODE
where t1.CTF_DEFAULT = 1
order by t1.CTF_FEE desc)tt
where tt.CTF_TENO=CE_CET_D.CED_T_CODE
===============>
top 1 应该是费用最少的吧,别人帮你们测试,是你们付费的?
如果CE_CET_D表只保存每个项目的最少费用纪录:UPDATE D
SET D.CET_TEST_COMP= T.CTF_CPNO
,D. CED_UP=T.CTF_FEE
,D. CED_CUR=T.CTF_CCUNO
FROM CE_CET_D D
JOIN CE_TESTFEE T
ON D.CED_T_CODE = T.CTF_TENO --项目字段关联
AND T.CTF_DEFAULT = 1
AND T.CTF_FEE=(select min(CTF_FEE) from CE_TESTFEE
where CTF_TENO=T.CTF_TENO)
CREATE TABLE #CE_TESTFEE (
[CTF_TENO] [varchar] (8) ,
[CTF_CPNO] [char] (10) ,
[CTF_FEE] [decimal](18, 2) ,
[CTF_CCUNO] [char] (10) ,
[CTF_DEFAULT] [bit]
)
GO
CREATE TABLE #CE_CET_D (
[CED_NO] [varchar] (8) ,
[CED_SN] [int] ,
[CED_T_CODE] [varchar] (8) ,
[CET_TEST_COMP] [varchar] (40) ,
[CED_UP] [decimal](18, 2) ,
[CED_CUR] [varchar] (20)
)
GOinsert into #CE_TESTFEE
select 'A001','SGS-TW',354.50,'NT',0 union all
select 'A001','ITS-GZ',152.69,'RMB',1 union all
select 'A001','ITS-SZ',84.30,'RMB',1 union all
select 'A002','SGS-TW',220.50,'NT',1 union all
select 'A002','ITS-GZ',52.69,'RMB',1 union all
select 'A002','ITS-SZ',50,'RMB',1
insert into #CE_CET_D
select '05090401',1,'A001','',0,'' union all
select '05090401',2,'A001','',0,'' union all
select '05090401',3,'A002','',0,'' -- vivianfdlpw() 符合我的要求,因为我这里有个币别,所以
--费用是不可比较的,没有汇率档,只要选择top 1,按照公司代号排序即可
UPDATE D
SET D.CET_TEST_COMP= T.CTF_CPNO,D. CED_UP=T.CTF_FEE,D. CED_CUR=T.CTF_CCUNO
FROM #CE_CET_D D
JOIN #CE_TESTFEE T
ON D.CED_T_CODE = T.CTF_TENO --项目字段关联
AND T.CTF_CPNO=(select top 1 CTF_CPNO from #CE_TESTFEE
where CTF_TENO=T.CTF_TENO and CTF_DEFAULT=1)/*
CED_NO CED_SN CED_T_CODE CET_TEST_COMP CED_UP CED_CUR
-------- ----------- ---------- ---------------------------------------- -------------------- --------------------
05090401 1 A001 ITS-GZ 152.69 RMB
05090401 2 A001 ITS-GZ 152.69 RMB
05090401 3 A002 SGS-TW 220.50 NT (3 row(s) affected)
*/
-- filebat(Mark)和我当初写的思路差不多,也是走进一个误区
UPDATE #CE_CET_D
SET #CE_CET_D.CET_TEST_COMP= tt.CTF_CPNO
,#CE_CET_D.CED_UP=tt.CTF_FEE
,#CE_CET_D.CED_CUR=tt.CTF_CCUNO
FROM (select top 1 t1.* --因为是top1,因为没有按照测试项目分类,
--因此找出来是全部的top 1,因为只是更新了一笔
from #CE_TESTFEE as t1 join #CE_CET_D as t2
on t1.CTF_TENO=t2.CED_T_CODE
where t1.CTF_DEFAULT = 1
order by t1.CTF_FEE desc)tt
where tt.CTF_TENO=#CE_CET_D.CED_T_CODE
select * from #CE_CET_D
/*
CED_NO CED_SN CED_T_CODE CET_TEST_COMP CED_UP CED_CUR
-------- ----------- ---------- ---------------------------------------- -------------------- --------------------
05090401 1 A001 .00
05090401 2 A001 .00
05090401 3 A002 SGS-TW 220.50 NT (3 row(s) affected)
*/