【发布时间】:2017-09-13 05:10:59
【问题描述】:
我一直在写这个存储过程,我对存储过程有点陌生。我一直在尝试将插入放入循环中,但逻辑不对。
基本上,下面的存储过程只将最后一行插入到表中。 但是,当我打印出临时表时,它会正确显示所有数据,但不知何故插入/更新无法正常工作
下面是存储过程的脚本。谁能告诉我,我在这里错过了什么?
--exec [dbo].[spAddIntoTemplateCalculationsTable] @templateID=1,@parameterList='0:C:Test:True:0,0:B:TEST2:False:0,0:A-b/c*a::False:0',
--@EmployeeNo = 'test'
ALTER PROCEDURE [dbo].[spAddIntoTemplateCalculationsTable]
( -- Add the parameters for the stored procedure here
@templateID nvarchar(max),
@parameterList nvarchar(max),
@EmployeeNo nvarchar(16)
)
AS
BEGIN
Declare @ErrorNo integer = '',
@ErrorMessage nvarchar(max) = '',
@SPName nvarchar(max) = ''
DECLARE @paramID nvarchar(MAX),@formula nvarchar(MAX), @property nvarchar(MAX),@samplesRequired nvarchar(MAX),@tUnitOfMeasures_id int,
@Pos int,@strSampleData nvarchar(MAX),@IntCounter int,@test int
DECLARE @tmpParameterParam table
(
paramID nvarchar(MAX),
formula nvarchar(MAX),
property nvarchar(MAX),
samplesRequired nvarchar(MAX),
tUnitOfMeasures_id int
)
SET @parameterList = LTRIM(RTRIM (@parameterList))+ ','
SET @Pos = CHARINDEX (',', @parameterList,1)
--SET @IntCounter = 1
IF REPLACE(@parameterList, ',' , '') <> ''
begin
WHILE @Pos > 0
BEGIN
SET @strSampleData = LTRIM(RTRIM(LEFT(@parameterList, @Pos -1)))
IF @strSampleData <> ''
BEGIN
set @paramID = substring(@strSampleData,0, CHARINDEX(':',@strSampleData,0))
--Remove the substring and move the string to the next token(column)
set @strSampleData = substring(@strSampleData, LEN(@paramID)+2, LEN(@strSampleData))
set @formula = substring(@strSampleData,0, CHARINDEX(':',@strSampleData,0))
--Remove the substring and move the string to the next token(column)
set @strSampleData = substring(@strSampleData, LEN(@formula)+2, LEN(@strSampleData))
--update tSpecScaleValidation set LastTriggeredTime=getdate() where id= @tSpecScaleValidation_id
set @property = substring(@strSampleData,0, CHARINDEX(':',@strSampleData,0))
set @strSampleData = substring(@strSampleData, LEN(@property)+2, LEN(@strSampleData))
set @samplesRequired = substring(@strSampleData,0, CHARINDEX(':',@strSampleData,0))
set @strSampleData = substring(@strSampleData, LEN(@samplesRequired)+4, LEN(@strSampleData))
set @tUnitOfMeasures_id = substring(@strSampleData,0, CHARINDEX(':',@strSampleData,0))
--to get the last token from the string(column)
set @tUnitOfMeasures_id = substring(@strSampleData, LEN(@tUnitOfMeasures_id)+1, LEN(@strSampleData))
insert into @tmpParameterParam
--select @IntCounter,@strSampleData
select @paramID,@formula,@property,@samplesRequired,@tUnitOfMeasures_id
END
SET @parameterList = RIGHT(@parameterList, LEN (@parameterList) - @Pos)
set @Pos = CHARINDEX(',', @parameterList,1)
SET @IntCounter = @IntCounter + 1
END
END
begin transaction t1
begin try
declare @setno int
select * from @tmpParameterParam
--begin
if EXISTS (SELECT * FROM tTemplate_Calculation where id = @paramID)
update tTemplate_Calculation
set formula=@formula,
property = @property ,
samplesRequired=@samplesRequired,
tUnitOfMeasures_id=@tUnitOfMeasures_id
where id = @paramID
else
insert into tTemplate_Calculation
select @templateID,@formula,@property,@samplesRequired,@tUnitOfMeasures_id,@EmployeeNo,getdate()
FROM @tmpParameterParam
--end
commit transaction t1
end try
Begin Catch
Select
@ErrorMessage = ERROR_MESSAGE(),
@SPName = ERROR_PROCEDURE(),
@ErrorMessage = ERROR_MESSAGE();
rollback transaction t1
select @ErrorMessage
End Catch
END
【问题讨论】:
-
我试图根据临时表插入和更新记录。但它只是插入最后一行
-
另外,我有一个检查,如果paramID为0,它应该插入,否则,更新表
-
当表为空且转换 nvarchar 值 'False??' 时转换失败时失败到数据类型位并且使用 exec [dbo].[spAddIntoTemplateCalculationsTable] @templateID=1,@parameterList='0:C:Test:True:0,0:B:TEST2:False:0 执行时不插入任何内容0:Ab/c*a::False:0', @EmployeeNo = 'test' 和显示的 3 行是过程中的调试选择语句。
-
插入语句不正确,来自表变量的字段不应以@开头。您可能希望将所需的示例更改为位以外的其他值,或者将参数从 true 和 false 更改为 1 或 0。我会在过程中添加一些验证逻辑,并加强表定义以包含允许的值。更新阶段可能会导致问题,因为它只会在您的输入字符串中找到的最后一个 @paramid 更新这是您真正想要的(它永远不会找到 paramid = 0 的位置,因为标识列总是从 1 开始)?
标签: sql-server stored-procedures