1

私はこの質問が繰り返されるかもしれないことを知っています。クエリを2回以上チェックしましたが、何が問題なのかわかりません。

これがカーソル付きのストアドプロシージャです。

ALTER PROCEDURE [dbo].[SPApprove_Request](@Id int, @NumRowsChanged int OUTPUT)
AS
BEGIN TRAN ApprovalTransaction

DECLARE @Mapping_Id int, @C_Id int, @Service_Table varchar(50), @Ser_Id int, @sql nvarchar(4000), @Today_Date datetime

    SET @Today_Date=GETDATE()

    DECLARE cursorObj CURSOR LOCAL static FOR SELECT serType.Service_Table_Name, serMap.Id, serMap.Request_Id FROM [Service_Type] as serType, [Service_Mapping] as serMap WHERE serType.Id = serMap.Service_Type_Id AND serType.Id IN (SELECT Service_Type_Id FROM Service_Mapping WHERE Request_Id = @Id) and serMap.Request_Id=@Id

    OPEN cursorObj
    --SELECT @@CURSOR_ROWS AS TotalRows
    FETCH NEXT FROM cursorObj into @Service_Table, @Mapping_Id, @C_Id
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @sql = 'INSERT into dbo.' + quotename(@Service_Table) + '(Request_Id, Is_Active, Is_Deleted, Is_Cancelled, Created_Date) VALUES (' + @C_Id + ',1, 0, 0,'''+ convert(VARCHAR,@Today_Date) +''')'
        EXEC sp_executesql @sql
        SELECT @Ser_Id = @@IDENTITY
        IF (@@ERROR <> 0) GOTO ERR_HANDLER
        UPDATE [Service_Mapping] SET Service_Id = @Ser_Id WHERE Id = @Mapping_Id
        FETCH NEXT FROM cursorObj into @Service_Table, @Mapping_Id, @C_Id
    END
    CLOSE cursorObj
    DEALLOCATE cursorObj
    UPDATE [Request] SET State_Id = 2, Service_State_Id = 1, Approve_Disapprove_Date = @Today_Date, Date_Modified = @Today_Date WHERE Id = @Id
    SELECT @NumRowsChanged = @@ROWCOUNT
COMMIT TRAN ApprovalTransaction
RETURN @NumRowsChanged  

ERR_HANDLER:
PRINT 'Unexpected error occurred while Approving CRM Request!'
ROLLBACK TRAN ApprovalTransaction

エラーの取得:

メッセージ245、レベル16、状態1、プロシージャSPApprove_CRM_Doctor_Request、19行目
nvarchar値'INSERTをdboに変換するときに変換に失敗しました。

4

2 に答える 2

1

@C_Id文字列に連結するには、varcharに変換する必要があります。

SET @sql = 'INSERT into dbo.' + quotename(@Service_Table) + 
   '(Request_Id, Is_Active, Is_Deleted, Is_Cancelled, Created_Date) 
   VALUES (' + convert(varchar,@C_Id) + ',1, 0, 0,'''+ convert(VARCHAR,@Today_Date) +''')'
于 2013-03-18T07:18:06.470 に答える
0

また、パラメータを使用してsp_executesqlシステムストアドプロシージャを使用できます

SET @sql = 'INSERT into dbo.' + quotename(@Service_Table) + '(Request_Id, Is_Active, Is_Deleted, Is_Cancelled, Created_Date) VALUES (@C_Id,1, 0, 0,@Today_Date)'
EXEC sp_executesql @sql, N'@C_Id int, @Today_Date datetime', @C_Id, @Today_Date
于 2013-03-18T07:38:41.017 に答える