2016-05-13 134 views
0

通过开发应用程序。我需要一个动态存储过程,我在这里调用一个表名(@pxxx),并且我还需要传递相同的参数 - 这里我有2(datum,por)。 它运行良好,通过tablename作为@pxxx - o.k.另外,当参数datum,por是类型-int或varchar,或char或它的组合时。诠释我改变为varchar通过CONVERT - 过程进展顺利。以及从C#调用。 问题是我将参数-datum更改为datetime。它不工作。改变日期“转换”为varchar没有帮助。它在sql管理工作室中不起作用。我需要解决一个问题,因为我需要在表数据[日期时间], 我不能更改表定义,需要datetime。 我查找几乎所有关于传递参数和动态SQL存储过程的问题,但我找不到解决方案。在MS SQL 2005SQL Server存储过程参数 - 不同类型

表定义:

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 

此存储过程 - 运作良好但只有withous日期时间参数。

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

没有帮助,所以114,或改变语言为英国。 –

+0

错误信息>从字符串转换日期时间时失败。 我读的地方在动态SQL命令必须是字符串(varchar)。因此,我通过CONVERT(VARCHAR,@参数)转换每个参数,它对int有帮助,但不支持datetime –

+1

这里有几个问题。首先,你应该参数化你的动态sql来帮助防止sql注入。你也转换为varchar,但不指定长度。我的问题是,如果你插入到日期时间列为什么你传递一个varchar?您还需要定义“不工作”。那是什么意思? –

回答

0

这是一个使用parameterzied动态sql做这个工作的例子。这有助于防止SQL注入,并允许您使用正确的输入参数。

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 

该表是否包含正确的值?

select * from p001 
+0

正在工作。重新启动后...非常感谢。 –