Sql server 如何使用newid()为存储过程变量赋值?
我正在尝试生成一个新的GUID,并将该值分配给Sql server 如何使用newid()为存储过程变量赋值?,sql-server,tsql,newid,Sql Server,Tsql,Newid,我正在尝试生成一个新的GUID,并将该值分配给NewReportID。但是,如果我用newid()替换过程中的每一处@NewReportID,我不确定它是否会为每一行生成一个新的GUID 要生成一个GUID并为NewReportID分配GUID的值,我需要做什么 我尝试了变量声明:@NewReportID varchar(50)=newid(),但这给了我很多错误 ALTER PROCEDURE [dbo].[AmendInsertDuplicateFields] (@ReportID varc
NewReportID
。但是,如果我用newid()
替换过程中的每一处@NewReportID
,我不确定它是否会为每一行生成一个新的GUID
要生成一个GUID并为NewReportID分配GUID的值,我需要做什么
我尝试了变量声明:@NewReportID varchar(50)=newid()
,但这给了我很多错误
ALTER PROCEDURE [dbo].[AmendInsertDuplicateFields] (@ReportID varchar(50), @NewReportID varchar(50))
AS
Begin
INSERT INTO [MVCOmar].[dbo].[PrideMVCCollisionBegin]
([ReportID], [LocalIncidentNum], [version], [MTOReferenceNo], [Submitted])
SELECT @NewReportID, [LocalIncidentNum], [version], [MTOReferenceNo], [Submitted]
FROM [MVCOmar].[dbo].[PrideMVCCollisionBegin] WHERE [ReportID]=@ReportID;
INSERT INTO [MVCOmar].[dbo].[PrideMVCCollisionDetails] ([Classification] ,
[ReportType] ,[CollisionDate] ,[CollisionDay] ,
[CollisionTime] ,[CollisionLoc] ,[ImpactLoc] ,[ThruLaneNo] ,
[Weather1] ,[Weather2] ,[Light] ,[TrafficControl] ,
[TrafficControlCond] ,[RoadChar1] ,[RoadChar2] ,
[RoadSurface1] ,[RoadSurface2] ,[RoadCond1] ,[RoadCond2] ,
[RoadSurfaceCond1] ,[RoadSurfaceCond2] ,[RoadAlignment1] ,
[RoadAlignment2] ,[RoadPavementMarking1] ,[RoadPavementMarking2] ,
[OtherCollisionLoc] ,[OtherImpactLoc] ,[OtherWeather1] ,
[OtherWeather2] ,[OtherLight] ,[OtherTraffic] ,
[OtherRoadSurface1] ,[OtherRoadSurface2] ,[OtherRoadSurfaceCond1] ,
[OtherRoadSurfaceCond2] ,[OtherClassification] ,
[DiagramDescription] ,[R1NumLanes] ,[R1MaxSpeed] ,
[R1AdviseSpeed] ,[R2NumLanes] ,[R2MaxSpeed] ,[R2AdviseSpeed] ,
[NumInvolved] ,[OfficerID] ,[Checked] ,[LastModified] ,
[LastModifiedBy] ,[StartTime] ,[EndTime] ,[Display] ,
[ReportID] ,[InitialImpactType] ,[OtherInitialImpactType] ,
[SelfReported])
SELECT [Classification] ,[ReportType] ,[CollisionDate] ,
[CollisionDay] ,[CollisionTime] ,[CollisionLoc] ,[ImpactLoc] ,
[ThruLaneNo] ,[Weather1] ,[Weather2] ,[Light] ,
[TrafficControl] ,[TrafficControlCond] ,[RoadChar1] ,
[RoadChar2] ,[RoadSurface1] ,[RoadSurface2] ,[RoadCond1] ,
[RoadCond2] ,[RoadSurfaceCond1] ,[RoadSurfaceCond2] ,
[RoadAlignment1] ,[RoadAlignment2] ,[RoadPavementMarking1] ,
[RoadPavementMarking2] ,[OtherCollisionLoc] ,[OtherImpactLoc] ,
[OtherWeather1] ,[OtherWeather2] ,[OtherLight] ,
[OtherTraffic] ,[OtherRoadSurface1] ,[OtherRoadSurface2] ,
[OtherRoadSurfaceCond1] ,[OtherRoadSurfaceCond2] ,
[OtherClassification] ,[DiagramDescription] ,[R1NumLanes] ,
[R1MaxSpeed] ,[R1AdviseSpeed] ,[R2NumLanes] ,[R2MaxSpeed] ,
[R2AdviseSpeed] ,[NumInvolved] ,[OfficerID] ,[Checked] ,
[LastModified] ,[LastModifiedBy] ,[StartTime]
End
使用正确的数据类型<代码>唯一标识符
declare @NewReportID uniqueidentifier
set @NewReportID = NEWID()
您使用的是什么风格的sql server?我试过了你说的错误: 我尝试了变量声明:@NewReportID varchar(50)=newid(),但这给了我很多错误
ALTER PROCEDURE [dbo].[AmendInsertDuplicateFields] (@ReportID varchar(50), @NewReportID varchar(50))
AS
Begin
INSERT INTO [MVCOmar].[dbo].[PrideMVCCollisionBegin]
([ReportID], [LocalIncidentNum], [version], [MTOReferenceNo], [Submitted])
SELECT @NewReportID, [LocalIncidentNum], [version], [MTOReferenceNo], [Submitted]
FROM [MVCOmar].[dbo].[PrideMVCCollisionBegin] WHERE [ReportID]=@ReportID;
INSERT INTO [MVCOmar].[dbo].[PrideMVCCollisionDetails] ([Classification] ,
[ReportType] ,[CollisionDate] ,[CollisionDay] ,
[CollisionTime] ,[CollisionLoc] ,[ImpactLoc] ,[ThruLaneNo] ,
[Weather1] ,[Weather2] ,[Light] ,[TrafficControl] ,
[TrafficControlCond] ,[RoadChar1] ,[RoadChar2] ,
[RoadSurface1] ,[RoadSurface2] ,[RoadCond1] ,[RoadCond2] ,
[RoadSurfaceCond1] ,[RoadSurfaceCond2] ,[RoadAlignment1] ,
[RoadAlignment2] ,[RoadPavementMarking1] ,[RoadPavementMarking2] ,
[OtherCollisionLoc] ,[OtherImpactLoc] ,[OtherWeather1] ,
[OtherWeather2] ,[OtherLight] ,[OtherTraffic] ,
[OtherRoadSurface1] ,[OtherRoadSurface2] ,[OtherRoadSurfaceCond1] ,
[OtherRoadSurfaceCond2] ,[OtherClassification] ,
[DiagramDescription] ,[R1NumLanes] ,[R1MaxSpeed] ,
[R1AdviseSpeed] ,[R2NumLanes] ,[R2MaxSpeed] ,[R2AdviseSpeed] ,
[NumInvolved] ,[OfficerID] ,[Checked] ,[LastModified] ,
[LastModifiedBy] ,[StartTime] ,[EndTime] ,[Display] ,
[ReportID] ,[InitialImpactType] ,[OtherInitialImpactType] ,
[SelfReported])
SELECT [Classification] ,[ReportType] ,[CollisionDate] ,
[CollisionDay] ,[CollisionTime] ,[CollisionLoc] ,[ImpactLoc] ,
[ThruLaneNo] ,[Weather1] ,[Weather2] ,[Light] ,
[TrafficControl] ,[TrafficControlCond] ,[RoadChar1] ,
[RoadChar2] ,[RoadSurface1] ,[RoadSurface2] ,[RoadCond1] ,
[RoadCond2] ,[RoadSurfaceCond1] ,[RoadSurfaceCond2] ,
[RoadAlignment1] ,[RoadAlignment2] ,[RoadPavementMarking1] ,
[RoadPavementMarking2] ,[OtherCollisionLoc] ,[OtherImpactLoc] ,
[OtherWeather1] ,[OtherWeather2] ,[OtherLight] ,
[OtherTraffic] ,[OtherRoadSurface1] ,[OtherRoadSurface2] ,
[OtherRoadSurfaceCond1] ,[OtherRoadSurfaceCond2] ,
[OtherClassification] ,[DiagramDescription] ,[R1NumLanes] ,
[R1MaxSpeed] ,[R1AdviseSpeed] ,[R2NumLanes] ,[R2MaxSpeed] ,
[R2AdviseSpeed] ,[NumInvolved] ,[OfficerID] ,[Checked] ,
[LastModified] ,[LastModifiedBy] ,[StartTime]
End
但这对我有用
使用
VARCHAR()
有什么原因吗
理想情况下,您应该使用uniqueidentifier
类型
DECLARE
@myGUID uniqueidentifier
SELECT
@myGUID = NewID()
编辑 当您使用
VARCHAR()
时,您可以将其转换为字符串。这比任何真正的技术问题都更浪费空间
DECLARE
@myGUID VARCHAR(50)
SELECT
@myGUID = CONVERT(varchar(50), @myid)
在SP中,@newReportID是一个输入参数。因此,您可以将SP更改为不需要输入,或在输入之前设置它
使用当前SP
DECLARE
@myGUID VARCHAR(50)
SELECT
@myGUID = CONVERT(varchar(50), @myid)
EXEC [dbo].[AmendInsertDuplicateFields] @reportID, @myGUID
更改SP
ALTER PROCEDURE [dbo].[AmendInsertDuplicateFields] (@ReportID varchar(50))
AS
BEGIN
DECLARE
@NewReportID VARCHAR(50)
SELECT
@NewReportID = CONVERT(varchar(50), @myid)
-- Then use @NewReportID onwards in the SP
并仅使用一个参数调用SP
EXEC [dbo].[AmendInsertDuplicateFields] @reportID
我是否必须像您一样单独声明newreportID,还是只添加SET@newreportID…..声明它-->设置它-->使用它:)您真的想重复我的答案吗;)不幸的是,previosu程序员没有使用正确的数据类型,简单的更改(如数据类型更改)非常耗时,因为我的应用程序包含60多个sql表和60多个存储过程…@mouters-我启动后您就完成了。并发问题;)+1对于详细答案以及解决方案的替代方案,这是对问题库的一个很好的补充。不幸的是,previosu程序员没有使用正确的数据类型,而简单的更改(如数据类型更改)非常耗时,因为我的应用程序有60多个sql表和60多个存储过程……我可以更改过程[dbo]吗。[AmendInsertDuplicateFields](@ReportID varchar(50),@NewReportID varchar(50))设置@NewReportID=newid();由于所有的好答案,你们很难选择最佳答案……因为简单的解决方案而被接受为答案,幸运的是select语句还回答了我的一个小问题,即如何返回NewReportID值:SqlDataReader=command.ExecuteReader();while(reader.Read()){ NeGuiDe=读者[TopReadd ] ] toStReg(;);纳达尔;“因为所有好的答案,你们很难选择最佳答案”——你是否考虑过对那些你认为是有用的(包括这一个)的答案进行投票??您已经问了70个问题,但只投了16次赞成票。投票是免费的,您每天最多有40个,它为您提供了机会,在有用的地方奖励人们的努力。显然,您不必投票,这是可选的,但可能需要考虑一下……您使用的是什么样的sql server?