SQL Server存储过程参数 - 不同类型

时间:2016-05-13 14:49:03

标签: sql-server stored-procedures parameter-passing

开发应用程序。我需要一个动态存储过程,我在这里调用一个表名(@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 

1 个答案:

答案 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