編集 すべてのあなたの助けをありがとう。
まず第一に、私はこれと同じエラーを抱えている人々のたくさんの投稿と質問を読みました、鉱山は異なります、int
そしてbigint
エラーは同じままです、私は挿入または更新することができません。私はMicrosoftSQL Server 2017 Management Studioを使用していますが、この2〜3日間この問題が発生しています。答えがたくさんあることはわかっていますが、Fが間違っていることはわかりません。
これは私のストアドプロシージャです:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[myproc]
(@name VARCHAR(50),
@ID BIGINT,
@birthdate DATETIME,
@Enabled BIT,
@married BIT,
@employees INT,
@hiredDate DATETIME)
AS
BEGIN
SET NOCOUNT ON
DECLARE @sql AS NVARCHAR(MAX)
SET @sql ='IF EXISTS(SELECT * FROM MyTable WHERE MyTable.ID ='+@ID+')
UPDATE MyTable
SET
name ='+@name+'
,birthdate='+@birthdate+'
,Enabled ='+@Enabled+'
,married='+@married+'
,employees='+@employees+'
,hiredDate='+@hiredDate+'
where ID = '+@ID+'
ELSE
INSERT INTO MyTable(name,ID,birthdate,Enabled,married,employees,hiredDate)VALUES(
'+@name+','+@ID+','+convert(varchar,@birthdate,20)+','+@Enabled+','+@married+','+@employees+','+convert(varchar,@hiredDate,20)+')'
EXEC (@SQL)
END
私はこのいまいましいエラーにうんざりしていて、それを失っています。
メッセージ8114、レベル16、状態5、プロシージャtestinsert、行0 [バッチ開始行0]
データ型varcharの日時への変換中にエラーが発生しました。
私はこの小さなテーブルを作ったので、この試用版を試してみることができました
このストアドプロシージャは次のコマンドで実行します。
DECLARE @return_value INT
EXEC @return_value = testinsert
@name = 'asd',
@ID = 25,
@birthdate = '2018-12-10 16 45 00',
@Enabled = 1,
@married = NULL,
@employees = NULL,
@hiredDate = NULL
SELECT 'Return Value' = @return_value
GO
テーブル:
[dbo].[MYDTABLE]
([name]
,[ID]
,[birthdate]
,[Enabled]
,[married]
,[employees]
,[hiredDate])
VALUES
(<name, varchar(50),>
,<ID, bigint,>
,<birthdate, datetime,>
,<Enabled, bit,>
,<married, bit,>
,<employees, int,>
,<hiredDate, datetime,>)
GO
テーブル名を渡そうとしているので(質問ではなくコメントで言及されています)、テーブル名はパラメーター化できないため、動的SQLが必要です。ただし、すべての値と同じように、名前をパラメーターとしてプロシージャに渡すことができます。次に、動的SQLをパラメーター化して、データ型変換などの面倒な作業をすべて排除できます。このようなものはかなり近いはずです。また、読みやすくするために空白をたくさん追加しました。
ALTER PROCEDURE [dbo].[myproc]
(
@name varchar(50)
, @ID bigint
, @birthdate datetime
, @Enabled bit
, @married bit
, @employees int
, @hiredDate datetime
, @TableName sysname
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @sql AS NVARCHAR(MAX)
SET @sql = 'IF EXISTS(SELECT * FROM ' + QUOTENAME(@TableName) + ' WHERE ID = @ID )
UPDATE ' + QUOTENAME(@TableName) + '
SET
name = @name
, birthdate = @birthdate
, Enabled = @Enabled
, married = @married
, employees = @employees
, hiredDate = @hiredDate
where ID = @ID
ELSE
INSERT INTO ' + QUOTENAME(@TableName) + '
(
name
, ID
, birthdate
, Enabled
, married
, employees
, hiredDate
)VALUES
(
@name
, @ID
, @birthdate
, @Enabled
, @married
, @employees
, @hiredDate
)'
EXEC sp_executesql @sql,
N'@name varchar(50)
, @ID bigint
, @birthdate datetime
, @Enabled bit
, @married bit
, @employees int
, @hiredDate datetime'
, @name = @name
, @ID = @ID
, @birthdate = @birthdate
, @Enabled = @Enabled
, @married = @married
, @employees = @employees
, @hiredDate = @hiredDate
END
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加