2016-04-20 3 views
0

Я пытаюсь создать параметризованный запрос для получения данных обратно из таблицыSQL параметризованных имена столбцов

По существу у меня есть таблица структура ID nvarchar1 NTEXT datetime1 Datetime2

и я пытаясь сделать запрос так, чтобы он выбирал все данные, где текущая дата больше, чем datetime1 и меньше, чем datetime2

SELECT 
    ID, nvarchar1, 
    ntext, 
    datetime1, 
    datetime2 
FROM 
    TABLEName 
WHERE 
    datetime1 >= @CurrentDate 
    AND datetime2 <= @CurrentDate 

Я хочу, чтобы параметры столбцов, такие как @TableName, @CurrentDate, @StartDate, @EndDate

DECLARE @TableName NVARCHAR(100); 
SET @TableName = '[Surveys].[dbo].[Table]' 

DECLARE @CurrentDate DateTime; 
SET @CurrentDate = GETDATE(); 

DECLARE @StartDate NVARCHAR(100); 
SET @StartDate = 'datetime1' 

DECLARE @EndDate NVARCHAR(100); 
SET @EndDate = 'datetime2' 

DECLARE @sql nvarchar(1000) 
SET @sql = 'SELECT * FROM ' + @TableName + 'WHERE' + @EndDate + '>=' + @CurrentDate + 'AND' + @StartDatedatetime1 + '<=' + @CurrentDate 
EXEC(@sql) 

Данные будут приходить из источника данных SP, так что я не имею никакого контроля колонки имена и т. д., и когда я создаю списки SP, они автоматически присваивают столбец таблицы этого типа, поэтому мне нужно, чтобы столбцы были параметрами.

Используя приведенный выше код, который я думал, что должен работать возвращается

Msg 241, Level 16, State 1, Line 14 преобразование не удалось при преобразовании даты и/или времени из строки символов.

Что я делаю неправильно?

+2

Так что ваш вопрос? – MusicLovingIndianGirl

+0

Вам не нужны кавычки для переменных типа datetime. ICBW. –

ответ

2

Попробуйте нижеследующее. Как сказал @GordonLinoff, вы, где отсутствовали одинарные кавычки ('), из-за переменной @CurrentDate. Кроме того, вы передаете параметр DATETIME в переменную @sql, которая является типом данных NVARCHAR. Они не преобразовывается, поэтому @CurrentDate переменными должны быть преобразованы к NVARCHAR первым:

DECLARE @sql nvarchar(1000) 
SET @sql = 'SELECT * FROM ' + @TableName 
    + ' WHERE ' + @EndDate + ' >= ''' + CONVERT(NVARCHAR(50), @CurrentDate,120) 
    + ''' AND ' + @StartDate + ' <= ''' + CONVERT(NVARCHAR(50), @CurrentDate,120) + '''' 


EXEC(@sql) 
+1

Если вы посмотрите на ответ Гордонса, что параметр передается без преобразования, и он указан в тексте querie без кавычек ... Использование параметров подразумевает ** избегать ** буквально заданных значений в запросе. Во-вторых: особенно при работе с значениями datetime следует избегать конверсий, если это когда-либо возможно (если это неизбежно, предпочитайте '126'). – Shnugo

+0

Результатом этого является один столбец без названия со значением ---- SELECT * FROM [Surveys]. [Dbo]. [Z_TEST] WHERE datetime2> = '2016-04-20 13:24:25' AND datetime1 <= '2016-04-20 13:24:25' ----- Кажется, он приближается, но не совсем там? – KlydeMonroe

+0

Должна ли переменная CurrentDate быть установлена ​​как DateTime, и должны ли StartDate и EndDate быть DateTime или должны быть nvarchar и преобразованы в оператор select? – KlydeMonroe

2

Вы довольно близко. Я хотел бы построить SQL для таблицы, а затем использовать параметры для текущей даты: Это было бы что-то вроде этого:

SET @sql = ' 
SELECT * 
FROM @TableName 
WHERE datetime2 >= @CurrentDate AND datetime1 <= @CurrentDate'; 

SET @sql = REPLACE(@sql, '@TableName', @TableName); 

exec sp_executesql @sql, N'@CurrentDate date', @CurrentDate = @CurrentDate; 

Кстати, проблема с вашим запросом является отсутствием одинарных кавычек вокруг констант даты.

EDIT:

Вы не можете заменить или столбца таблицы имен с использованием параметров. Я бы написал код как:

SET @sql = ' 
SELECT * 
FROM @TableName 
WHERE @datetime2 >= @CurrentDate AND @datetime1 <= @CurrentDate'; 

SET @sql = REPLACE(@sql, '@TableName', @TableName); 
SET @sql = REPLACE(@sql, '@datetime1', @DateTime1); 
SET @sql = REPLACE(@sql, '@datetime2', '@DateTime2); 

. , ,

Я использую REPLACE() для этого типа операций, потому что код легче понять и поддерживать.

+0

Я не уверен, что понимаю ... У меня это работает, как показано ниже ... DECLARE @ CurrentDate DateTime; SET @ CurrentDate = GETDATE(); Выбор TOP 1000 [ID] , [nvarchar1] , [ntext2] , [datetime1] , [datetime2] FROM [Обзоры]. [DBO].[z_TEST] WHERE datetime2> = @ CurrentDate И datetime1 <= @ CurrentDate Но как только я попробую преобразовать datetime1 и datetime2 в params, это не удастся - Пространства в переменной, преднамеренные для комментариев – KlydeMonroe

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