开发应用程序。我需要一个动态存储过程,我在这里调用一个表名(@pxxx),我也传递相同的参数 - 这里我有2个(datum,por)。 它运行良好,将tablename作为@pxxx - o.k传递。此外,当参数datum,por是类型-int或varchar,或char或它的组合时。 Int我通过CONVERT更改为varchar - 程序顺利。好吧ig从C#打来电话。 问题是当我将参数-datum更改为 datetime 时。它不起作用。通过“转换”到varchar来更改日期没有帮助。它在sql management studio中不起作用。我需要解决一个问题,因为我需要表datum [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
此存储过程 - 运行良好,但仅限于日期时间参数。
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
答案 0 :(得分:0)
以下是使用parameterzied dynamic sql执行此操作的工作示例。这有助于防止sql注入,并允许您使用正确键入的参数。
`Shape#draw`
现在测试一下,看它是否有效。
create PROCEDURE [dbo].[SPinsertpxx2]
(
@pxxx nchar(4)
, @datum datetime
, @por int
) AS
DECLARE @sqlCommand nvarchar(max)
SET @sqlCommand = 'INSERT INTO '+ @pxxx +' ([datum],[por]) VALUES(@datum, @por)'
exec sp_executesql @sqlCommand, N'@datum datetime, @por int', @datum = @datum, @por = @por
表格是否包含正确的值?
exec SPinsertpxx2 'p001', '2016-01-01', 42