Передать Datetime в запросе SQL в формате строки? - PullRequest
0 голосов
/ 18 мая 2011

У меня есть строковый запрос и я передаю объект @Date в строку.Это дает ошибку.См. Код ниже.

Declare @MidDate datetime, @MaxDate datetime


set @qrysales_trans_unit_26wks ='update historical_result
    set sales_trans_unit_26wks = (      
            SELECT      
            SUM(sales_trans_unit)
            FROM reg_summary_rowno  WHERE  
            period_idx >= '+  @MidDate  // error 
            +' AND period_idx <'+  @MaxDate /error
            +' AND Client_id ='+ @Client_id
            +' and historical_result.[store_idx] = reg_summary_rowno.[store_idx]
            And [attributes] ='+  @attributes +')'

Как правильно передать объект Datetime в строку Query?

Ответы [ 7 ]

2 голосов
/ 18 мая 2011

Пара лучших вариантов, ИМХО.

Если вы действительно хотите использовать динамический SQL, прочитайте sp_executesql - и используйте возможность передавать параметры в SQL. Таким образом вы предотвратите атаки с использованием SQL-инъекций, а также не столкнетесь с проблемами, связанными со значением параметра string-ify.

В противном случае используются хранимые процедуры - что я бы посчитал лучшим вариантом здесь.

2 голосов
/ 18 мая 2011

Попробуйте использовать две одинарные кавычки, чтобы избежать кавычек, чтобы даты заканчивались следующим образом: period_idx> = '@MidDate'

set @qrysales_trans_unit_26wks ='update historical_result
        set sales_trans_unit_26wks = (      
                SELECT      
                SUM(sales_trans_unit)
                FROM reg_summary_rowno  WHERE  
                period_idx >= '''+  @MidDate
                +''' AND period_idx <'''+  @MaxDate
                +''' AND Client_id ='+ @Client_id
                +' and historical_result.[store_idx] = reg_summary_rowno.[store_idx]
                And [attributes] ='+  @attributes +')'

Нажмите здесь для получения дополнительной информации о экранировании кавычек в SQL.

0 голосов
/ 18 мая 2011

Я думаю, что вы должны использовать convert, прежде чем объединять переменную даты с предложением

Declare @MidDate datetime, @MaxDate datetime
set @qrysales_trans_unit_26wks = 'update historical_result
     set sales_trans_unit_26wks = (      
            SELECT      
            SUM(sales_trans_unit)
            FROM reg_summary_rowno  
            WHERE  
            period_idx >= '+ '''' + convert(varchar, @MidDate, 112) + ''''  // error 
            +' AND period_idx <'+  '''' + convert(varchar, @MaxDate, 112) + '''' /error
            +' AND Client_id ='+ @Client_id
            +' and historical_result.[store_idx] = reg_summary_rowno.[store_idx]
            And [attributes] ='+  @attributes +')'
0 голосов
/ 18 мая 2011

Если вы должны передать дату в строковом формате - во-первых, поместить ее в кавычки, а во-вторых, я настоятельно рекомендую вам использовать стандартный формат даты ISO-8601 (YYYYMMDD или YYYY-MM-DDTHH:MM:SS) ,

Большим преимуществом этих стандартных форматов ISO является то, что они будут работать независимо от того, на какие языковые и региональные параметры установлен ваш SQL Server. Любое другое строковое представление зависит от языка, например

05/10/2010

будет означать:

  • 10 мая 2010 года в США
  • 5 октября 2010 года почти во всем остальном мире

но 20101005 понятен и никогда не бывает двусмысленным - это всегда 5 октября 2010 года - даже для США: -)

0 голосов
/ 18 мая 2011

Я действительно рекомендую вам избегать объединения SQL таким образом. Это действительно откроет вас для инъекционных атак и т. Д.

Посмотрите на этот пример, чтобы увидеть другой подход, который вы могли бы использовать.

use tempdb
create table foo (id int not null identity, data datetime)

insert foo(data) values
('1/1/2010'),('1/10/2010'),('3/31/2010')


Declare @SQLStr nvarchar(4000)

set @SQLStr = 'select * from foo where data = @Data'

exec sp_executeSQL @SQLStr, N'@Data datetime', '1/1/2010'
0 голосов
/ 18 мая 2011

Чтобы исправить вашу ОШИБКУ, вам нужно добавить несколько одинарных кавычек ' вокруг дат в строке.

Еще одна вещь, которая улучшает ясность. Используйте ключевое слово МЕЖДУ:

    WHERE period_idx BETWEEN @MinimumDate AND @MaximumDate
0 голосов
/ 18 мая 2011

Вы можете использовать вместо datetime smalldatetime И вы можете использовать такие даты:

Declare @MidDate smalldatetime,
set @MidDate = '20110317'

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...