2015-05-04 8 views
1

У меня есть процедура, которая добавляет новые данные в таблицу.Дата хранимой процедуры SQL Server

Название таблицы находится в параметрах.

Ошибка

типы данных VARCHAR (макс) и дата несовместимы в операторе добавления.

Поле даты должно быть типа 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; 

Просто укажите правильные типы данных столбцов в третьей строке.

+0

Поле даты должно быть «дата». Я не могу бросить его в варчаре. Если нет никакого другого способа сделать это, я буду использовать ваш ответ. thx – Weedoze

+0

Дата будет в формате, который имеет ваш стол. Ошибка вызывается из-за того, что вы генерируете «Динамический код SQL», и она должна быть построена из VARCHAR. Кроме того, я бы также посмотрел sp_executesql –

+0

@Weedoze Я изменил свой ответ с помощью более безопасного и безопасного подхода. Пожалуйста, попробуйте это. –

Смежные вопросы