2016-05-13 26 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

正在工作。重新啓動後...非常感謝。 –