Sql server 我对sql server非常陌生,我正在尝试这样做。。。不知道我做错了什么
我是SQL Server的新手,我正在尝试这样做。。。不知道我做错了什么 这是我的模式:Sql server 我对sql server非常陌生,我正在尝试这样做。。。不知道我做错了什么,sql-server,Sql Server,我是SQL Server的新手,我正在尝试这样做。。。不知道我做错了什么 这是我的模式: CREATE TABLE [Product_AGGREGATION]( [Product_ID] [int] NULL, [ITERATION] [int] NULL, [EQUIPMENT_USED] [varchar](8) NULL, [MODEL_USED] [varchar](25) NULL, [SERIAL_NUMBER] [varchar](14) NULL
CREATE TABLE [Product_AGGREGATION](
[Product_ID] [int] NULL,
[ITERATION] [int] NULL,
[EQUIPMENT_USED] [varchar](8) NULL,
[MODEL_USED] [varchar](25) NULL,
[SERIAL_NUMBER] [varchar](14) NULL
)
CREATE TABLE [Product_MERGE](
[Product_ID] [int] NULL,
[EQUIPMENT_USED] [varchar](8) NULL,
[MODEL_USED] [varchar](25) NULL,
[SERIAL_NUMBER] [varchar](14) NULL
)
INSERT INTO [dbo].[PRODUCT_AGGREGATION]
VALUES
(6,1,'X10', '302000','005'),
(6,7,'X10' ,'310355','007'),
(3,1,'A12' ,'NULL','NULL'),
(3,4,'A10' ,'35205','002'),
(7,2,'A10' ,'37545','002'),
(7,4,'A10' ,'NULL','005')
这是我正在使用的存储过程
ALTER PROCEDURE [dbo].[SP_ProductMerge]
BEGIN
DECLARE @v_product_id INT
DECLARE @v_iteration INT
DECLARE @v_equip_used VARCHAR(8)
DECLARE @v_model_used VARCHAR(25)
DECLARE @v_serial_num VARCHAR(14)
DECLARE @c_Pid INT
DECLARE @c_iteration INT
DECLARE @c_equip_used VARCHAR(8)
DECLARE @c_model_used VARCHAR(25)
DECLARE @c_serial_num VARCHAR(14)
DECLARE c_PID CURSOR FOR
SELECT DISTINCT Product_id
FROM [Product_AGGREGATION]
ORDER BY Product_id
OPEN c_PID
FETCH NEXT FROM c_PID INTO @c_Pid
WHILE(@@FETCH_STATUS = 0)
BEGIN
SET @v_product_id = @c_Pid
SET @v_equip_used = NULL
SET @v_model_used = NULL
SET @v_serial_num = NULL
DECLARE c_ProductMerge CURSOR FOR
SELECT iteration, EQUIPMENT_USED, MODEL_USED, SERIAL_NUMBER
FROM [Product_AGGREGATION]
WHERE Product_id = @v_product_id
ORDER BY iteration
OPEN c_ProductMerge
FETCH NEXT FROM c_ProductMerge INTO @c_iteration, @c_equip_used, @c_model_used, @c_serial_num
WHILE(@@FETCH_STATUS = 0)
BEGIN
IF RTRIM(LTRIM(@c_equip_used)) IS NOT NULL AND @v_equip_used IS NULL
BEGIN
SET @v_equip_used = @c_equip_used
END
IF RTRIM(LTRIM(@c_model_used)) IS NOT NULL AND @v_model_used IS NULL
BEGIN
SET @v_model_used = @c_model_used
END
IF RTRIM(LTRIM(@c_serial_num)) IS NOT NULL AND @v_serial_num IS NULL
BEGIN
SET @v_serial_num = @c_serial_num
END
FETCH NEXT FROM c_ProductMerge INTO @c_iteration, @c_equip_used, @c_model_used, @c_serial_num
END
CLOSE c_ProductMerge
DEALLOCATE c_ProductMerge
INSERT INTO [dbo].Product_merge
VALUES (
@v_product_id, @v_equip_used, @v_model_used, @v_serial_num
)
FETCH NEXT FROM c_PID INTO @c_Pid
END
CLOSE c_PID
DEALLOCATE c_PID
END
GO
产品合并的预期结果
6 , 'X10', '302000' , '005'
3, 'A12', '35205', '002'
7,'A10'.'37545' , '002'
我没有得到产品3的预期结果。此外,我还需要帮助在没有光标的情况下编写这篇文章,或者至少使用一个光标而不是嵌套的光标 首先,“NULL”不等于NULL。根据您的数据,您需要将您的代码不为NULL替换为“NULL” 我想你需要的可以用这个问题来代替
SELECT
a.Product_ID
,EQUIPMENT_USE =(SElECT TOP 1 p.EQUIPMENT_USED FROM Product_AGGREGATION p WHERE p.Product_ID = a.Product_ID AND p.EQUIPMENT_USED <> 'NULL' ORDER BY ITERATION)
,MODEL_USED =(SElECT TOP 1 p.MODEL_USED FROM Product_AGGREGATION p WHERE p.Product_ID = a.Product_ID AND p.MODEL_USED <> 'NULL' ORDER BY ITERATION)
,SERIAL_NUMBER =(SElECT TOP 1 p.SERIAL_NUMBER FROM Product_AGGREGATION p WHERE p.Product_ID = a.Product_ID AND p.SERIAL_NUMBER <> 'NULL' ORDER BY ITERATION)
FROM Product_AGGREGATION a
GROUP BY a.Product_ID
您正试图通过此存储过程实现什么?旁注:您不应该在存储过程中使用sp_uuu前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp_u,并使用其他东西作为前缀——或者根本不使用前缀!你能用一个标题来编辑你的文章吗?这个标题实际上解释了你的问题或是一些有意义的东西?我没有得到产品id 3的预期结果,我做错了什么。另外,我如何在不使用游标的情况下编写此文件?您的要求是什么?根据插入的数据,确定返回这3行的原因的逻辑是什么?