SQL Server存储过程日期
我有一个在表中添加新数据的过程。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
普莱斯尝试使用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行指定正确的列数据类型即可。
日期字段必须是“日期”。我不能在varchar中投射它。如果绝对没有其他的方式去做,我会用你的答案。 thx – Weedoze
日期将采用您的表格的格式。由于您正在生成“动态SQL代码”并且必须从VARCHAR构建,因此会引发错误。另外,我还会看看sp_executesql –
@Weedoze我用更好和更安全的方法修改了我的答案。请尝试。 –
我发现这是因为表的名称在参数中。如果你有另一种方法来做到这一点,我可以改变 – Weedoze
所有的表都有相同的列规范和数据类型? – ughai
是的,它们都是一样的 – Weedoze