【发布时间】:2016-08-27 23:26:19
【问题描述】:
如果我的问题没有意义,我深表歉意。
所以我采用了一个使用 GUID 作为 PK 的数据库表,并且我已经对该数据库进行了规范化,并开始将现有数据库中的数据合并到新结构化的数据库中。 我有一个看起来像这样的原始表
create table #tmpMaterial
(
ID int identity(1,1),
MaterialID nvarchar(128),
MaterialCategoryID nvarchar(128),
MaterialTypeID nvarchar(128),
MaterialSubTypeID nvarchar(128),
MaterialDetail nvarchar(20),
Description nvarchar(100),
MaterialWidth numeric(10,2),
MaterialLength int,
MaterialSize nvarchar(20),
PurchUnitOfMeasureID nvarchar(128),
PurchaseItemQuantity int,
SellUnitOfMeasureID nvarchar(128),
SellItemQuantity int,
NewPrice money,
RemodPrice money,
ServicePrice money,
DefVendorID nvarchar(128),
EnabledInd tinyint
)
数据的插入是这样的
insert into #tmpMaterial
select tmpM.MaterialID, tmpM.MaterialCategoryID,tmpM.MaterialTypeID, tmpM.MaterialSubTypeID, tmpM.MaterialDetail, tmpM.Description, tmpM.MaterialWidth, tmpM.MaterialLength, tmpM.MaterialSize,
tmpM.PurchUnitOfMeasureID, tmpM.PurchItemQuantity, tmpM.SellUnitOfMeasureID, tmpM.SellItemQuantity, tmpM.NewPrice, tmpM.RemodPrice, tmpM.ServicePrice, tmpM.DefVendorID, tmpM.EnabledInd
from Exovations.dbo.Material tmpM
所以这会将原始数据插入到临时表中,这个临时表就是我要查询的。 我有一个临时表,它是新创建的确切表,它是
create table #tmpMaterialFinal
(
ID int identity(1,1),
MaterialCategoryID int,
MaterialTypeID int,
MaterialSubTypeID int,
CompanyID int,
DimensionsID int,
PurchaseUOMID int,
SellUOMID int,
VendorID int,
MaterialDetail nvarchar(20),
Description nvarchar(100),
PurchaseItemQuantity int,
NewPrice money,
RemodelPrice money,
ServicePrice money,
IsActive bit
)
我正在查询#tmpMaterial 表并在此过程中进行一些连接以将该数据导入#tmpMaterialFinal 表。我预见的问题是,如果您查看#tmpMaterial 表,我有这三列
MaterialWidth numeric(10,2),
MaterialLength int,
MaterialSize nvarchar(20)
在我的#tmpMaterialFinal 中我有DimensionsID,这是它自己的名为Dimensions 的表,在Dimensions 表中我有3 列,一列用于宽度、长度和尺寸。
我需要做的是在向#tmpMaterialFinal 表中插入记录时,我需要调用一个名为usp_InsertDimensions 的存储过程并从#tmpMaterial 表中传递这3 个值,在插入#tmpMaterialFinal 表时我需要执行usp_InsertDimensions存储过程并获取其返回的 ID,以便我可以将该 ID 放入DimensionID 列中。
我的 usp_InsertDimensions 看起来像这样
CREATE PROCEDURE [dbo].[usp_InsertDimensions]
(
@DimensionID int output,
@DLength decimal(15,4),
@DWidth decimal(15,4),
@DHeight decimal(15,4)
)
AS
SET NOCOUNT OFF
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
DECLARE @ERROR_SEVERITY int,
@MESSAGE varchar(1000),
@ERROR_NUMBER int,
@ERROR_PROCEDURE nvarchar(200),
@ERROR_LINE int,
@ERROR_MESSAGE nvarchar(4000);
begin try
insert into [Dimensions]
(DLength, DWidth, DHeight)
values
(@DLength, @DWidth, @DHeight)
set @DimensionID = SCOPE_IDENTITY()
end try
BEGIN CATCH
SET @ERROR_SEVERITY = ISNULL(ERROR_SEVERITY(),'');
SET @ERROR_NUMBER = ISNULL(ERROR_NUMBER(),'');
SET @ERROR_PROCEDURE = ISNULL(ERROR_PROCEDURE(),'');
SET @ERROR_LINE = ISNULL(ERROR_LINE(),'');
SET @ERROR_MESSAGE = ISNULL(ERROR_MESSAGE(),'');
-- Test if the transaction is uncommittable.
IF (XACT_STATE()) = -1
BEGIN
--PRINT N'The transaction is in an uncommittable state. Rolling back transaction.'
ROLLBACK TRANSACTION;
END;
-- Test if the transaction is active and valid.
IF (XACT_STATE()) = 1
BEGIN
--PRINT N'The transaction is committable. Committing transaction.'
COMMIT TRANSACTION;
END;
SET @MESSAGE = 'Error Occured in Stored Procedure ' + cast(@ERROR_PROCEDURE as varchar(200)) +
'; Line Number ' + cast(@ERROR_LINE as varchar) +
'; Message: [' + cast(@ERROR_NUMBER as varchar) + '] - '
+ cast(@ERROR_MESSAGE as varchar(255))
RAISERROR(@MESSAGE, @ERROR_SEVERITY, 1);
END CATCH;
关于实现这一目标的正确方法有什么想法吗?
【问题讨论】:
-
我相信对this question 的回答应该能让您启动并运行。
-
@KamilG.,我查看了您提供的链接,我了解正在执行的操作的概念,但现在我收到错误子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
标签: sql sql-server