2015-05-04 53 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我用更好和更安全的方法修改了我的答案。请尝试。 –