2016-05-13 6 views
0

При разработке приложения. Мне нужна динамическая хранимая процедура, где я вызываю имя таблицы (@pxxx), и я также передал те же параметры - здесь у меня есть 2 (datum, por). Он работает хорошо, передавая имя файла как @pxxx - o.k. Также, когда параметром datum, por являются type -int или varchar, или char или его комбинация. Int Я перехожу в varchar через CONVERT - процедура идет хорошо. Хорошо ig собирается звонить с C#. Проблема в том, что я изменяю параметр -datum на datetime. Это не работает. Изменение даты «конвертировать» в varchar не помогло. Он не работает в студии управления sql. Мне нужно решить проблему, потому что мне нужно в таблице datum [datetime], Я не могу изменить определение таблицы, datetime требуется. Я искал почти все вопросы о прохождении параметров и динамических хранимых процедурах sql, но я не нашел решения.Параметры хранимой процедуры SQL Server-РАЗЛИЧНЫЕ типы

определения таблицы в 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 

Эта хранимая процедура - работает хорошо, но только withous параметр 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 
+0

не помогло, поэтому 114, или изменение языка на британский. –

+0

Ошибка msg> не удалось при преобразовании даты и времени из символьной строки. Я читал, что в динамической sql-команде должна быть строка (varchar). И каждый параметр, поэтому я конвертирую с помощью CONVERT (VARCHAR, @ parameter), он помог для int, но не datetime –

+1

У вас есть несколько проблем, которые происходят здесь. Сначала вы должны параметризовать свой динамический sql, чтобы предотвратить внедрение sql. Также вы конвертируете в varchar, но не указываете длину. Мой вопрос в том, что вы вставляете в столбец datetime, почему вы передаете varchar? Вам также необходимо определить «не работает». Что это значит? –

ответ

0

Ниже приведен рабочий пример этого с помощью параметризованного динамического 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

Теперь работает. После перезапуска ... Большое спасибо. –

Смежные вопросы