2015-05-04 133 views
1

我有一個在表中添加新數據的過程。SQL Server存儲過程日期

表的名稱在參數中。

該錯誤是

的數據類型的varchar(max)和日期是在添加操作不相容。

日期字段必須是類型date

程序

USE [ProposalBuilderDev] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[addLog] 
    -- Add the parameters for the stored procedure here 
    @table varchar(max), 
    @date date, 
    @version varchar(max), 
    @process varchar(max), 
    @level varchar(max), 
    @message varchar(max), 
    @stacktrace varchar(max), 
    @user varchar(max), 
    @environmentID varchar(max), 
    @UUID varchar(max), 
    @UDID varchar(max), 
    @transactionID int, 
    @new_identity int OUTPUT 

AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    DECLARE @sql NVARCHAR(MAX); 

    SET @sql = 'INSERT INTO dbo.' + @table + '([Timestamp], [Version],Process,[Level],[Message],StackTrace,[User],EnvironmentID,UUID,UDID,TransactionID) VALUES (' + @date + ',' + @version + ',' + @process + ','+ @level + ','+ @message + ','+ @stacktrace + ','+ @user + ','+ @environmentID + ','+ @UUID + ','+ @UDID + ',' + @transactionID + ')' 
    EXEC @sql 

    SET @new_identity = SCOPE_IDENTITY(); 
END 
+0

我發現這是因爲表的名稱在參數中。如果你有另一種方法來做到這一點,我可以改變 – Weedoze

+0

所有的表都有相同的列規範和數據類型? – ughai

+0

是的,它們都是一樣的 – Weedoze

回答

4

普萊斯嘗試使用CAST()

... + CAST(@date AS VARCHAR(MAX) + ...

此外,使用sp_executesql將是一個更好,更安全的方法。

DECLARE @SQL NVARCHAR(MAX); 

SET @SQL = ' INSERT INTO dbo.' + @Table; 
SET @SQL += ' ([Timestamp], [Version],Process,[Level],[Message],StackTrace,[User],EnvironmentID,UUID,UDID,TransactionID)'; 
SET @SQL += ' VALUES'; 
SET @SQL += ' (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10);'; 

EXECUTE sp_executesql 
     @SQL 
    , N'@p0 DATE, @p1 VARCHAR(MAX), @p2 VARCHAR(MAX), @p3 VARCHAR(MAX), @p4 VARCHAR(MAX), @p5 VARCHAR(MAX), @p6 VARCHAR(MAX), @p7 VARCHAR(MAX), @p8 VARCHAR(MAX), @p9 VARCHAR(MAX), @p10 VARCHAR(MAX)' 
    , @p0 = @date 
    , @p1 = @version 
    , @p2 = @process 
    , @p3 = @level 
    , @p4 = @message 
    , @p5 = @stacktrace 
    , @p6 = @user 
    , @p7 = @environmentID 
    , @p8 = @UUID 
    , @p9 = @UDID 
    , @p10 = @transactionID; 

只需在第3行指定正確的列數據類型即可。

+0

日期字段必須是「日期」。我不能在varchar中投射它。如果絕對沒有其他的方式去做,我會用你的答案。 thx – Weedoze

+0

日期將採用您的表格的格式。由於您正在生成「動態SQL代碼」並且必須從VARCHAR構建,因此會引發錯誤。另外,我還會看看sp_executesql –

+0

@Weedoze我用更好和更安全的方法修改了我的答案。請嘗試。 –