如何将日期时间字段与 T-SQL 中的字符串连接
How to concatenate a datetime field with a string in T-SQL
我有一个动态查询,我正在尝试使用 sp_executesql 执行它。在动态查询中,我有一个日期时间类型的字段。此字段作为参数从 C# .NET 传递到 SQL 服务器中的存储过程。我使用典型命令从 C# 调用此 sp:
public static object ExecuteProcedure(int userId, DbConnection con, DbTransaction trans, string procedureName, bool withLog, params MyCustomParameter[] parameters)
{
if (con.State != ConnectionState.Open)
con.Open();
bool bMyTransaction = trans == null;
if (trans == null)
trans = con.BeginTransaction();
try
{
MyLog log = withLog ? MyLog.FromProcedure(trans, procedureName, parameters) : null;
DbCommand command = con.CreateCommand();
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = procedureName;
command.Transaction = trans;
command.AddMyCustomParameters(parameters);
int result = command.ExecuteNonQuery();
if (log != null)
log.SaveLogData();
if (bMyTransaction == true)
trans.Commit();
return result;
}
catch (Exception ex)
{
if (bMyTransaction == true)
trans.Rollback();
return null;
}
}
它在行中抛出异常:
int result = command.ExecuteNonQuery();
抛出的错误是(从西班牙语翻译):
Error converting a string of characters in date and/or time.
存储过程如下所示:
CREATE PROCEDURE [dbo].[spLogger]
@Id varchar(100),
@Param1 varchar(100),
@Param2 varchar(15),
@Param3 int,
@DateTimeField datetime,
@Param4 varchar(100),
@TargetTable tinyint = 0
AS
BEGIN
DECLARE @sqlCommand nvarchar(max)
DECLARE @tblName nvarchar(100)
SET @tblName = CASE @TargetTable
WHEN 0 THEN '[dbo].[LogTable_01]'
WHEN 1 THEN '[dbo].[LogTable_02]'
WHEN 2 THEN '[dbo].[LogTable_03]'
ELSE ''
END
IF @tblName <> ''
BEGIN
SET @sqlCommand =
'INSERT INTO ' + @tblName +
'([Id] ' +
',[Param1] ' +
',[Param2] ' +
',[Param3] ' +
',[MyDateTimeField] ' +
',[Param4]) ' +
'VALUES' +
'(''' + @Id + ''',''' + @Param1 + ''',''' + @Param2 + ''',' + CAST(@Param3 AS VARCHAR(10)) + ',' + @DateTimeField + ',''' + @Param4 + ''')'
EXECUTE sp_executesql @sqlCommand
END
END
参数@DateTimeField是C#传过来的,是DateTime类型。此参数传递的值如下:
27/02/2020 18:05:05
在 table 中,MyDateTimeField 被定义为日期时间。
那么如何将 T-SQL 中的日期时间字段连接到字符串?
另外你可以看到我拼接了一个INT类型,参数@Param3,我也想知道我拼接是否也ok。
select a.a, FORMAT(a.a,'dd/MM/yyyy h:mm:ss tt')
from
(select convert(datetime, '2020-02-27 12:30:00' ) as a) a
输出:
2020-02-27 12:30:00.000 27/02/2020 12:30:00 PM
这显示了如何将 datetime
转换为字符串,您可以使用它连接到您的 @sqlCommand。
不要注入参数;它们是 参数 。您需要通过将它们作为参数添加到 sys.sp_executesql
来对它们进行参数化。那么你就没有连接 datetime
的问题,因为你实际上传递了一个 datetime
数据类型:
CREATE PROCEDURE [dbo].[spLogger]
@Id varchar(100),
@Param1 varchar(100),
@Param2 varchar(15),
@Param3 int,
@DateTimeField datetime,
@Param4 varchar(100),
@TargetTable tinyint = 0
AS
BEGIN
DECLARE @sqlCommand nvarchar(max);
DECLARE @CRLF nchar(2) = NCHAR(13) + NCHAR(10); --This helps with formatting
DECLARE @tblName sysname; --Changed to proper data type
SET @tblName = CASE @TargetTable
WHEN 0 THEN N'LogTable_01'
WHEN 1 THEN N'LogTable_02'
WHEN 2 THEN N'LogTable_03'
END;
IF @tblName IS NOT NULL
BEGIN
SET @sqlCommand =N'INSERT INTO dbo.' + QUOTENAME(@tblName) + ' ([Id] ' + @CRLF +
N' ,[Param1] ' + @CRLF +
N' ,[Param2] ' + @CRLF +
N' ,[Param3] ' + @CRLF +
N' ,[MyDateTimeField] ' + @CRLF +
N' ,[Param4]) ' + @CRLF +
N'VALUES (@Id, @Param1, @Param2, @Param3, @DateTimeField, @Param4);'l
--PRINT @SQL; --your debugging friend.
EXECUTE sys.sp_executesql @sqlCommand, N'@Id varchar(100),@Param1 varchar(100),@Param2 varchar(15),@Param3 int,@DateTimeField datetime,@Param4 varchar(100)',@Id, @Param1, @Param2, @Param3, @DateTimeField, @Param4;
END;
END;
我有一个动态查询,我正在尝试使用 sp_executesql 执行它。在动态查询中,我有一个日期时间类型的字段。此字段作为参数从 C# .NET 传递到 SQL 服务器中的存储过程。我使用典型命令从 C# 调用此 sp:
public static object ExecuteProcedure(int userId, DbConnection con, DbTransaction trans, string procedureName, bool withLog, params MyCustomParameter[] parameters)
{
if (con.State != ConnectionState.Open)
con.Open();
bool bMyTransaction = trans == null;
if (trans == null)
trans = con.BeginTransaction();
try
{
MyLog log = withLog ? MyLog.FromProcedure(trans, procedureName, parameters) : null;
DbCommand command = con.CreateCommand();
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = procedureName;
command.Transaction = trans;
command.AddMyCustomParameters(parameters);
int result = command.ExecuteNonQuery();
if (log != null)
log.SaveLogData();
if (bMyTransaction == true)
trans.Commit();
return result;
}
catch (Exception ex)
{
if (bMyTransaction == true)
trans.Rollback();
return null;
}
}
它在行中抛出异常:
int result = command.ExecuteNonQuery();
抛出的错误是(从西班牙语翻译):
Error converting a string of characters in date and/or time.
存储过程如下所示:
CREATE PROCEDURE [dbo].[spLogger]
@Id varchar(100),
@Param1 varchar(100),
@Param2 varchar(15),
@Param3 int,
@DateTimeField datetime,
@Param4 varchar(100),
@TargetTable tinyint = 0
AS
BEGIN
DECLARE @sqlCommand nvarchar(max)
DECLARE @tblName nvarchar(100)
SET @tblName = CASE @TargetTable
WHEN 0 THEN '[dbo].[LogTable_01]'
WHEN 1 THEN '[dbo].[LogTable_02]'
WHEN 2 THEN '[dbo].[LogTable_03]'
ELSE ''
END
IF @tblName <> ''
BEGIN
SET @sqlCommand =
'INSERT INTO ' + @tblName +
'([Id] ' +
',[Param1] ' +
',[Param2] ' +
',[Param3] ' +
',[MyDateTimeField] ' +
',[Param4]) ' +
'VALUES' +
'(''' + @Id + ''',''' + @Param1 + ''',''' + @Param2 + ''',' + CAST(@Param3 AS VARCHAR(10)) + ',' + @DateTimeField + ',''' + @Param4 + ''')'
EXECUTE sp_executesql @sqlCommand
END
END
参数@DateTimeField是C#传过来的,是DateTime类型。此参数传递的值如下:
27/02/2020 18:05:05
在 table 中,MyDateTimeField 被定义为日期时间。
那么如何将 T-SQL 中的日期时间字段连接到字符串?
另外你可以看到我拼接了一个INT类型,参数@Param3,我也想知道我拼接是否也ok。
select a.a, FORMAT(a.a,'dd/MM/yyyy h:mm:ss tt')
from
(select convert(datetime, '2020-02-27 12:30:00' ) as a) a
输出:
2020-02-27 12:30:00.000 27/02/2020 12:30:00 PM
这显示了如何将 datetime
转换为字符串,您可以使用它连接到您的 @sqlCommand。
不要注入参数;它们是 参数 。您需要通过将它们作为参数添加到 sys.sp_executesql
来对它们进行参数化。那么你就没有连接 datetime
的问题,因为你实际上传递了一个 datetime
数据类型:
CREATE PROCEDURE [dbo].[spLogger]
@Id varchar(100),
@Param1 varchar(100),
@Param2 varchar(15),
@Param3 int,
@DateTimeField datetime,
@Param4 varchar(100),
@TargetTable tinyint = 0
AS
BEGIN
DECLARE @sqlCommand nvarchar(max);
DECLARE @CRLF nchar(2) = NCHAR(13) + NCHAR(10); --This helps with formatting
DECLARE @tblName sysname; --Changed to proper data type
SET @tblName = CASE @TargetTable
WHEN 0 THEN N'LogTable_01'
WHEN 1 THEN N'LogTable_02'
WHEN 2 THEN N'LogTable_03'
END;
IF @tblName IS NOT NULL
BEGIN
SET @sqlCommand =N'INSERT INTO dbo.' + QUOTENAME(@tblName) + ' ([Id] ' + @CRLF +
N' ,[Param1] ' + @CRLF +
N' ,[Param2] ' + @CRLF +
N' ,[Param3] ' + @CRLF +
N' ,[MyDateTimeField] ' + @CRLF +
N' ,[Param4]) ' + @CRLF +
N'VALUES (@Id, @Param1, @Param2, @Param3, @DateTimeField, @Param4);'l
--PRINT @SQL; --your debugging friend.
EXECUTE sys.sp_executesql @sqlCommand, N'@Id varchar(100),@Param1 varchar(100),@Param2 varchar(15),@Param3 int,@DateTimeField datetime,@Param4 varchar(100)',@Id, @Param1, @Param2, @Param3, @DateTimeField, @Param4;
END;
END;