2013-06-18 5 views
0

Я работаю с динамическим запросом прямо сейчас, и мне нужны значения из таблицы.Динамическое значение SQL из таблицы

Мой запрос до сих пор:

DECLARE @query varchar(1500) 
SET @query = 
'SELECT Id,' 
+ 'SUM(CASE WHEN ['+convert(varchar(50),CAST(myTable.myDate AS date),120)+'] = ['+convert(varchar(50), CAST(GETDATE() AS date), 120)+'] then [Counter] else 0 end) ''0'',' 
+ 'SUM(CASE WHEN ['+convert(varchar(50),CAST(DATEADD(day, -1, myTable.myDate)), 120)+'] = ['+convert(varchar(50),CAST(DATEADD(day, -1, GETDATE()) AS date), 120)+'] then [counter] else 0 end) ''1'',' 
+ 'SUM(CASE WHEN ['+convert(varchar(50),CAST(DATEADD(day, -2, myTable.myDate)), 120)+'] = ['+convert(varchar(50),CAST(DATEADD(day, -2, GETDATE()) AS date), 120)+'] then [counter] else 0 end) ''2'',' 
+ 'SUM(CASE WHEN ['+convert(varchar(50), CAST(DATEADD(day, -3, myTable.myDate)), 120)+'] = ['+convert(varchar(50),CAST(DATEADD(day, -3, GETDATE()) AS date),120)+'] then [counter] else 0 end) ''3'',' 
+ 'SUM(CASE WHEN ['+convert(varchar(50),CAST(DATEADD(day, -4, myTable.myDate)),120)+'] = ['+convert(varchar(50),CAST(DATEADD(day, -4, GETDATE()) AS date),120)+'] then [counter] else 0 end) ''4''' 
+ 'FROM [myTable] GROUP BY Id' 
PRINT(@query) 
EXEC(@query) 

Это не будет работать, потому что он говорит: "Multi-часть identifyer "MyTable" не могут быть связаны." на строках 4-8.

Ive видел людей recomending что-то вроде этого:

CREATE TABLE #tmp 
(
    id varchar(50), 
    counter int, 
    myDate smalldatetime 
) 
Insert Into #tmp (id, counter, myDate) 
SELECT * FROM myTable 
--GO      --doesn't work either with or without 'go' 
DECLARE @query varchar(1500) 
SET @query = 
'SELECT Id,' 
+ 'SUM(CASE WHEN ['+convert(varchar(50),CAST(#tmp.myDate AS date),120)+'] = ['+convert(varchar(50), CAST(GETDATE() AS date), 120)+'] then [counter] else 0 end) ''0'',' 
+ 'SUM(CASE WHEN ['+convert(varchar(50),CAST(DATEADD(day, -1, #tmp.myDate)), 120)+'] = ['+convert(varchar(50),CAST(DATEADD(day, -1, GETDATE()) AS date), 120)+'] then [counter] else 0 end) ''1'',' 
+ 'SUM(CASE WHEN ['+convert(varchar(50),CAST(DATEADD(day, -2, #tmp.myDate)), 120)+'] = ['+convert(varchar(50),CAST(DATEADD(day, -2, GETDATE()) AS date), 120)+'] then [counter] else 0 end) ''2'',' 
+ 'SUM(CASE WHEN ['+convert(varchar(50),CAST(DATEADD(day, -3, #tmp.myDate)), 120)+'] = ['+convert(varchar(50),CAST(DATEADD(day, -3, GETDATE()) AS date),120)+'] then [counter] else 0 end) ''3'',' 
+ 'SUM(CASE WHEN [+'convert(varchar(50),CAST(DATEADD(day, -4, #tmp.myDate)), 120)+'] = ['+convert(varchar(50),CAST(DATEADD(day, -4, GETDATE()) AS date),120)+'] then [aounter] else 0 end) ''4''' 
+ 'FROM [myTable] GROUP BY Id' 
PRINT(@query) 
EXEC(@query) 

Тем не менее не работает. Пожалуйста помоги!

упрощённая версия моей проблемы:

DECLARE @query varchar(1500) 
SET @query = 'SELECT ['+myTable.value+'] FROM [myTable]' 
EXEC(@query) 

не работает

+0

'FROM # tmp' является то, что будет использоваться, если temp table (так называемая '# tmp') была загружена .. там * есть * таблица, называемая' myTable', правильно? То есть, 'SELECT COUNT (*) FROM myTable'« работает », если нет в динамическом запросе? Может быть, текущая схема отличается от ожидаемой? Если да, то работает '[theCorrectSchema]. [MyTable]'? – user2246674

+0

Да, вы сделали опечатку или ошибку в запросе во втором примере, FROM #tmp – mirkobrankovic

+0

да, существует таблица «myTable». если я делаю SELECT COUNT (*) FROM mytable вне динамического, он работает. Я пробовал [theCorrectSchema]. [MyTable], и ​​он не работает. –

ответ

0

Попробуйте что-то вроде этого:

CREATE TABLE #tmp 
(
    id varchar(50), 
    counter int, 
    myDate smalldatetime 
) 
Insert Into #tmp (id, counter, myDate) 
SELECT * FROM myTable 

DECLARE @query varchar(1500) 
Select @query = 
'SELECT Id,' 
+ 'SUM(CASE WHEN ''' + convert(varchar(50), #tmp.myDate,120) + ''' = '''+convert(varchar(50), GETDATE(), 120)+''' then ''counter'' else 0 end) ''0'',' 
+ 'SUM(CASE WHEN '''+convert(varchar(50), DATEADD(day, -1, #tmp.myDate), 120)+''' = '''+convert(varchar(50),DATEADD(day, -1, GETDATE()), 120)+''' then ''counter'' else 0 end) ''1'',' 
+ 'SUM(CASE WHEN '''+convert(varchar(50), DATEADD(day, -2, #tmp.myDate), 120)+''' = '''+convert(varchar(50),DATEADD(day, -2, GETDATE()), 120)+''' then ''counter'' else 0 end) ''2'',' 
+ 'SUM(CASE WHEN '''+convert(varchar(50), DATEADD(day, -3, #tmp.myDate), 120)+''' = '''+convert(varchar(50),DATEADD(day, -3, GETDATE()), 120)+''' then ''counter'' else 0 end) ''3'',' 
+ 'SUM(CASE WHEN '''+convert(varchar(50), DATEADD(day, -4, #tmp.myDate), 120)+''' = '''+convert(varchar(50),DATEADD(day, -4, GETDATE()), 120)+''' then ''counter'' else 0 end) ''4''' 
+ ' FROM ' from #tmp 
Set @query = @query + ' #tmp GROUP BY Id' 
PRINT(@query) 
EXEC(@query) 
+0

. Все еще не работает. Это не нравится seccond «from» в строке «+» FROM 'из #tmp ». и он по-прежнему не позволит мне использовать # tmp.myDate выше –

+0

Изменили запрос, пожалуйста, проверьте. – unlimit

+0

извините. Тем не менее «Идентификатор из нескольких частей« # tmp.myDate »не может быть связан –

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