【发布时间】:2016-05-13 14:49:03
【问题描述】:
通过开发应用程序。我需要一个动态存储过程,我在其中调用表名(@pxxx),并且我还需要传递相同的参数 - 这里我有 2 个(datum,por)。 它运行良好,将表名传递为@pxxx - 好的。此外,当参数 datum,por 为 -int 或 varchar,或 char 或它们的组合时。 Int 我通过 CONVERT 更改为 varchar - 过程顺利。好吧,我会从 C# 调用。 问题是当我将参数 -datum 更改为 datetime 时。它不工作。通过“转换”更改日期为 varchar 没有帮助。它在 sql management studio 中不起作用。我需要解决一个问题,因为我需要在表数据[datetime]中, 我无法更改表定义,需要日期时间。 几乎所有关于传递参数和动态sql存储过程的问题都找了一遍,但没有找到解决办法。
MS SQL 2005 中的表定义:
CREATE TABLE [dbo].[p001](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[datum] [datetime] NULL,
[por] [int] NULL,
[cas] [nchar](5) NULL,
[max] [int] NULL,
[obsad] [int] NULL,
[blok] [bit] NULL
one of it ) ON [PRIMARY]
我的存储过程 - 不工作
ALTER PROCEDURE [dbo].[SPinsertpxx2] (@pxxx nchar(4),@date datetime, @por int)
AS
DECLARE @sqlCommand varchar(500)
SET @sqlCommand = 'INSERT INTO '+ @pxxx +' ([datum],[por]) VALUES('
+CONVERT(VARCHAR,@date,112)+','+CONVERT(VARCHAR,@por,5)+')'
BEGIN
EXEC (@sqlCommand)
END
这个存储过程 - 运行良好,但只有没有 datetime 参数。
ALTER PROCEDURE [dbo].[SPinsertpxxx] (@pxxx nchar(4),@cas nvarchar(10), @por int)
AS
DECLARE @sqlCommand varchar(500)
SET @sqlCommand = 'INSERT INTO '+ @pxxx +' ([cas],[por]) VALUES('
+CONVERT(VARCHAR,@cas)+','+CONVERT(VARCHAR,@por)+')'
BEGIN
EXEC (@sqlCommand)
END
【问题讨论】:
-
没有帮助,所以 114,或者将语言更改为英国。
-
Error msg>从字符串转换日期时间时失败。我在动态 sql 命令中的相同位置必须是字符串(varchar)。因此,我通过 CONVERT(VARCHAR,@parameter) 转换每个参数,它对 int 有帮助,但对 datetime 没有帮助
-
这里有几个问题。首先,您应该参数化您的动态 sql 以帮助防止 sql 注入。此外,您正在转换为 varchar 但未指定长度。我的问题是,如果您要插入日期时间列,为什么要传递 varchar?您还需要定义“不工作”。这是什么意思?
-
因为如果我将更改程序更改为“@datum datetime”,我会收到错误。
-
您分享错误信息而不是让我们猜测如何?我的猜测是,如果您使用参数化动态 sql,则该错误将不再发生。
标签: sql-server stored-procedures parameter-passing