Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Сводные таблицы  [new]
Mindzor
Member

Откуда:
Сообщений: 63
Предположим есть таблица:
maker type
A PC
B Laptop
B PC
C Printer
C Laptop

Нужно сделать сводную таблицу:
_PC Laptop Printer
A
B
C

Насколько я понял это можно сделать как минимум двумя способами:
так
      SELECT maker,
      SUM(CASE type WHEN 'pc' THEN 1 ELSE 0 END) PC
      , SUM(CASE type WHEN 'laptop' THEN 1 ELSE 0 END) Laptop
      , SUM(CASE type WHEN 'printer' THEN 1 ELSE 0 END) Printer
      FROM Product
      GROUP BY maker
и так
      SELECT maker,
      [pc], [laptop], [printer]
      FROM Product
      PIVOT
      (COUNT(model)
      FOR type
      IN([pc], [laptop], [printer])) pvt

Но в обоих случаях надо перечислять тип продукции (pc, laptop, printer). Как сделать это автоматически?
8 окт 10, 21:19    [9578667]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8734
select @@version
Если 2000, то см. хелп по динамическому SQL

Если 2008, то PIVOT
9 окт 10, 00:36    [9579391]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
Mindzor
Member

Откуда:
Сообщений: 63
SQL Server 2008
В хэлпе указано что надо явно перечислять сведенные столбцы - Использование операторов PIVOT и UNPIVOT
А я хочу чтобы выполнялось автоматически.
Например если бы можно было вместо перечисления всех сведенных столбцов написать
(SELECT DISTINCT type FROM product ORDER BY 1)
9 окт 10, 07:28    [9579780]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
1) Тесты нужно решать самостоятельно
2) https://www.sql.ru/faq/faq_topic.aspx?fid=130
https://www.sql.ru/faq/faq_topic.aspx?fid=731
9 окт 10, 08:27    [9579819]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mindzor
SQL Server 2008
В хэлпе указано что надо явно перечислять сведенные столбцы - Использование операторов PIVOT и UNPIVOT
А я хочу чтобы выполнялось автоматически.
Например если бы можно было вместо перечисления всех сведенных столбцов написать
(SELECT DISTINCT type FROM product ORDER BY 1)

А как вы себе представляете процесс узнавания сервером результата этого запроса при построении плана ?
Ведь для построения плана серверу нужно будет узнать число столбцов
9 окт 10, 10:30    [9579936]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
TRANSFORM
Guest
Glory
...
Ведь для построения плана серверу нужно будет узнать число столбцов

...Акцес-то как-то с этим - справляется без явного указания по чём пивотить, почему МС СКЛ - нет ?
9 окт 10, 10:53    [9579965]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
TRANSFORM
Glory
...
Ведь для построения плана серверу нужно будет узнать число столбцов

...Акцес-то как-то с этим - справляется без явного указания по чём пивотить, почему МС СКЛ - нет ?

А Акцес - сервер баз данных ?
9 окт 10, 11:05    [9579972]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
TRANSFORM
Guest
Glory

А Акцес - сервер баз данных ?

хорошо, хотите точной терминологии - нате

Microsoft Jet Database Engine - это (пивот по имени поля, а не по конкретным его значениям) - умеет делать
почему MS SQL Server - нет ?
9 окт 10, 11:24    [9579986]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
TRANSFORM
Glory

А Акцес - сервер баз данных ?

хорошо, хотите точной терминологии - нате

Microsoft Jet Database Engine - это (пивот по имени поля, а не по конкретным его значениям) - умеет делать
почему MS SQL Server - нет ?

То, что Microsoft Jet Database Engine скрыл за командой кучу кода, в том числе на выборку данных, не означает, что все другие сервера это должны сделать за вас
Никто не мешает вам написать свой код
А mssql на этапе компиляции запроса этого делать не будет
Потому что он должен знать структуру результата заранее
И не будет для выяснения этой структуры обращаться к содержимому пользовательских таблиц
9 окт 10, 11:36    [9579992]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
Mindzor
Member

Откуда:
Сообщений: 63
Glory

Никто не мешает вам написать свой код

Можно вот здесь поподробнее, пожалуйста
9 окт 10, 15:29    [9580363]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Mindzor
Glory

Никто не мешает вам написать свой код

Можно вот здесь поподробнее, пожалуйста


http://t-sql.ru/post/Crosstab.aspx
9 окт 10, 16:06    [9580469]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
TRANSFORM
Guest
Glory
...
То, что Microsoft Jet Database Engine скрыл за командой кучу кода, в том числе на выборку данных, не означает, что все другие сервера это должны сделать за вас
Никто не мешает вам написать свой код
А mssql на этапе компиляции запроса этого делать не будет
Потому что он должен знать структуру результата заранее
И не будет для выяснения этой структуры обращаться к содержимому пользовательских таблиц

во-первых
спасибо за достаточно аргументированный ответ,
т.е. - я так понял - компилятору/оптимизатору, необходимо знать количество возвращаемых столбцов ?

ну, а во-вторых
а почему собственно бы и нет ?
пусть МС СКЛ - скроет от меня "кучу команд", но вернёт мне тот результат который я запросил,
без лишних, с моей стороны, телодвижений, в виде создания динамического запроса (я ж не ошибаюсь ? - под "Никто не мешает вам написать свой код" - Вы имеете в виду именно это ?)
я даже не буду против если МС поддержит 2-а пивота - с IN и без

сугубо имхо
9 окт 10, 17:13    [9580574]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
TRANSFORM

ну, а во-вторых
а почему собственно бы и нет ?
пусть МС СКЛ - скроет от меня "кучу команд", но вернёт мне тот результат который я запросил,
без лишних, с моей стороны, телодвижений, в виде создания динамического запроса (я ж не ошибаюсь ? - под "Никто не мешает вам написать свой код" - Вы имеете в виду именно это ?)
я даже не буду против если МС поддержит 2-а пивота - с IN и без

сугубо имхо

Еще раз
план выполнения строится ДО выполнения запроса
при построении плана не будет никаких обращений к содержимому таблиц
Потому что это может привести к неопределенному времени построения плана.
Не говоря уже про такие вещи, как поддержание актуальности полученных данных и их изоляции.
Поэтому никакого 2го пивота в принципе быть не может. Может быть только некий код на TSQL скомпанованный в одну процедуру/функцию
Если вы не в силах сами написать такой код, то возьмите уже написанный другими
9 окт 10, 17:21    [9580584]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
TRANSFORM
Guest
Glory
...
Если вы не в силах сами написать такой код, то возьмите уже написанный другими


ну не надо уж так себя рекламировать

Glory,

обратите внимание - я не ТС,
но я с ним полностью согласен, что такая "фыча" - была бы "дыко полезна"

>> Не говоря уже про такие вещи, как поддержание актуальности полученных данных и их изоляции.

какая к маме актуальность/изоляция ??!!
ежу понятно что результат перекрёстного запроса - это снепшот и ничего более от него - нетребуется!
9 окт 10, 17:31    [9580597]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
2SIMPLicity_: в следующий раз за мат буду баны раздавать. Имейте совесть.
10 окт 10, 01:23    [9582068]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8734
Гавриленко Сергей Алексеевич
2SIMPLicity_: в следующий раз за мат буду баны раздавать. Имейте совесть.

Уже отъимел...
10 окт 10, 01:30    [9582083]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
TRANSFORM

какая к маме актуальность/изоляция ??!!
ежу понятно что результат перекрёстного запроса - это снепшот и ничего более от него - нетребуется!

И сколько будет строится план при таком снэпшоте ? Раз в десять больше самого выполнения ?
10 окт 10, 11:59    [9582405]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
TRANSFORM
Guest
Glory
TRANSFORM

какая к маме актуальность/изоляция ??!!
ежу понятно что результат перекрёстного запроса - это снепшот и ничего более от него - нетребуется!

И сколько будет строится план при таком снэпшоте ? Раз в десять больше самого выполнения ?

...даа, незнаю я ..., а какая разница ?
а сколько он строится, когда я в динамике формирую PIVOT ... IN ?

да вообщем, неважно - сколько он будет строится, - работает - и зашибись..
тут мы опять возвращаемся к варианту - 2-а разных PIVOT-а...


зы
самое смешное - что я - несомневаюсь, что так и будет...
пусть это будет МС СКЛ 2018 - но там это сделают
а Вам, Glory, - будет "стыдно" ))) , за эту упёртость ...
10 окт 10, 23:07    [9584131]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8734
TRANSFORM
Glory
TRANSFORM

какая к маме актуальность/изоляция ??!!
ежу понятно что результат перекрёстного запроса - это снепшот и ничего более от него - нетребуется!

И сколько будет строится план при таком снэпшоте ? Раз в десять больше самого выполнения ?

...даа, незнаю я ..., а какая разница ?
а сколько он строится, когда я в динамике формирую PIVOT ... IN ?

да вообщем, неважно - сколько он будет строится, - работает - и зашибись..
тут мы опять возвращаемся к варианту - 2-а разных PIVOT-а...


зы
самое смешное - что я - несомневаюсь, что так и будет...
пусть это будет МС СКЛ 2018 - но там это сделают
а Вам, Glory, - будет "стыдно" ))) , за эту упёртость ...

Повторяться не буду - т.к. один раз отвечал (только почистили). А так ....
PS Я там никаво ни аскарблял...
11 окт 10, 00:22    [9584276]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
TRANSFORM
Guest
SIMPLicity_

Повторяться не буду - т.к. один раз отвечал (только почистили). А так ....
PS Я там никаво ни аскарблял...

мляяя, не читал....,
повторись

>> (только почистили)
видимо было что-то очень одухотворённое
11 окт 10, 00:27    [9584282]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
TRANSFORM

а Вам, Glory, - будет "стыдно" ))) , за эту упёртость ...

Что то много у вас персональных обвинений. То в какой то саморекламе, то в упертости
Если в у вас конкретные предложения по механизму такого пивота, то сайт производителя имеет специальный раздел для такого рода сообщений
Если конечно поймете разницу между разными этапами выполнения запроса
11 окт 10, 10:23    [9584962]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Сводные таблицы  [new]
SergeiGer
Member

Откуда:
Сообщений: 8
Mindzor,
Я давным дано написал код- Держите.
+
USE [IntekDB]
GO
/****** Object:  StoredProcedure [dbo].[spGreateCrosstab]    Script Date: 08.02.2017 12:28:17 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spGreateCrosstab]
(
@FullSelect VARCHAR (8000), 
@into varchar(8000) =NULL -- Таблица, которая будет создана и заполнена результатами выполнения процедуры (опционально)
)
AS
-- Пример вызова - ' TRANSFORM SUM(v.Balance) SELECT     v.ItemProfileID,  vi.Обозначение, SUM(v.Balance)AS Всего FROM BalanceWarehouse v  GROUP BY v.ItemProfileID  ORDER BY vi.Обозначение Pivot A.Name '
SET NOCOUNT ON
SET ANSI_WARNINGS OFF

--SET @FullSelect = REPLACE(@FullSelect,
DECLARE 
@source varchar(8000), --то, что между FROM и WHERE
@fields varchar(8000),  -- NULL --поля для отбора... по ним происходит группировка. Если не заданы, то результатом будет одна строка - итог по всем записям
@func varchar(8000), -- функция вида sum(some_field), count... и так далее ... НЕДОПУСТИМО использовать в качестве аргумента * (звездочку)
@pivot varchar(8000), -- правило для формирования полей
@pivotIN varchar(8000), -- Список полей
@filtr varchar(8000), -- NULL -- Условия отбора (то, что в запросе следует после WHERE)

@SelectFields varchar(8000) , -- NULL -- Имена полей в результирующем запросе 
@OrderBY varchar(8000) , -- NULL -- Сортровка
 @SortPivot varchar(8000)  --= null -- Сортровка полей


SET @FullSelect  = LTRIM (@FullSelect)
SET @FullSelect  = RTRIM (@FullSelect)

DECLARE @IntFrom INT, @IntSelect INT, @IntTRANSFORM INT, @IntWHERE INT, @IntGroupBY INT, @IntOrderBY INT, @IntPIVOT INT, @intSORTPIVOT INT, @intPivotIN INT
SET @IntTRANSFORM = CHARINDEX ('TRANSFORM' , @FullSelect)
SET @IntSelect = CHARINDEX ('Select' , @FullSelect, @IntTRANSFORM)
SET @IntFrom = CHARINDEX ('FRom' , @FullSelect, @IntSelect)

DECLARE @tmpFullSelect VARCHAR (8000), @tmpIntWHERE  INT
SET @tmpFullSelect = REVERSE (@FullSelect)
SET @tmpIntWHERE = CHARINDEX('EREHW' , @tmpFullSelect) + 3 
IF ISNULL( @tmpIntWHERE,0) > 3  SET @IntWHERE = LEN(@FullSelect) - @tmpIntWHERE 
ELSE SET @IntWHERE = 0

--SET @IntWHERE = CHARINDEX('WHERE' , @FullSelect, @IntFrom)
SET @IntGroupBY = CHARINDEX('GROUP BY' , @FullSelect, @IntWHERE)
SET @IntOrderBY = CHARINDEX('Order BY' , @FullSelect, @IntGroupBY)
SET @IntPIVOT = CHARINDEX('PIVOT' , @FullSelect, @IntOrderBY)
SET @intPivotIN = CHARINDEX('IN' , @FullSelect, @IntPIVOT)
SET @intSORTPIVOT = CHARINDEX('SORTPIVOT' , @FullSelect, @IntOrderBY)

IF @IntWHERE = 0 SET @IntWHERE = @IntGroupBY
IF @IntOrderBY = 0 SET @IntOrderBY = @IntPIVOT

IF @intSORTPIVOT = 0 SET @intSORTPIVOT = LEN ( @FullSelect) + 1
IF @intPivotIN = 0 SET @intPivotIN = @intSORTPIVOT

SET @func = SUBSTRING (@FullSelect, @IntTRANSFORM + 9, @IntSelect - (@IntTRANSFORM + 9))

SET @SelectFields = SUBSTRING (@FullSelect, @IntSelect + 6, @IntFrom - (@IntSelect + 6))

SET @source = SUBSTRING (@FullSelect, @IntFrom + 4, @IntWHERE - (@IntFrom + 4))

IF  @IntWHERE = @IntGroupBY
	SET @filtr = NULL
ELSE
	SET @filtr = SUBSTRING (@FullSelect, @IntWHERE + 5, @IntGroupBY - (@IntWHERE + 5))

SET @fields = SUBSTRING (@FullSelect, @IntGroupBY + 8, @IntOrderBY - (@IntGroupBY + 8 ))

IF @IntOrderBY = @IntPIVOT 
	SET @OrderBY = null
ELSE
	SET @OrderBY = SUBSTRING (@FullSelect, @IntOrderBY + 8, @IntPIVOT - (@IntOrderBY + 8 ))

SET @pivot = SUBSTRING (@FullSelect, @IntPIVOT + 5, @intPivotIN - (@IntPIVOT + 5 ))

IF  @intPivotIN = @intSORTPIVOT
	SET @pivotIN = NULL
ELSE
	SET @pivotIN = SUBSTRING (@FullSelect, @intPivotIN + 2, @intSORTPIVOT - (@intPivotIN + 2 ))


IF @intSORTPIVOT = LEN ( @FullSelect) + 1
	 SET @SortPivot = NULL 
ELSE
	SET @SortPivot = SUBSTRING (@FullSelect, @intSORTPIVOT + 9, LEN ( @FullSelect)- (@intSORTPIVOT + 9 ) + 1)


DECLARE 
@select VARCHAR(8000), 
@sql VARCHAR(8000), 
@sql1 VARCHAR(8000), 
@sql2 VARCHAR(8000), 
@sql3 VARCHAR(8000), 
@sql4 VARCHAR(8000), 
@sql5 VARCHAR(8000), 
@sql6 VARCHAR(8000), 
@sql7 VARCHAR(8000), 
@sql8 VARCHAR(8000), 
@sql9 VARCHAR(8000), 
@sqlend VARCHAR(8000), 
@delim VARCHAR(1), 
@sqllen numeric(10), 
@sqlnum numeric(10), 
@pvalue VARCHAR(8000),
@filtr1 varchar(8000) 



SET @filtr1=isnull(' AND '+@filtr, '')
SET @SortPivot =  ISNULL( @SortPivot, @pivot ) 
IF NOT @pivotIN  IS NULL 
	BEGIN
			DECLARE @tmpTable TABLE (MyPivot  VARCHAR (100))
			DECLARE @tmpInt INT, @tmpPivIn VARCHAR(50),  @tmpOldInt INT 
			---PRINT @pivotIN
			SET @pivotIN =SUBSTRING (@pivotIN,  CHARINDEX ( '(',@pivotIN, 1) + 1, LEN( @pivotIN) -  CHARINDEX ( '(',@pivotIN, 1))
			SET @pivotIN = REVERSE(SUBSTRING (REVERSE (@pivotIN ), CHARINDEX ( ')', REVERSE (@pivotIN ),1) + 1 , LEN(REVERSE (@pivotIN )) - CHARINDEX ( ')', REVERSE (@pivotIN ),1)))
			---PRINT @pivotIN
			IF CHARINDEX ( 'SELECT', @pivotIN  ,1) <> 0 
				BEGIN
					declare @strPart1 varchar(100), @strPart2 varchar(100)
					set @strPart1 = LEFT(@pivotIN, CHARINDEX('FROM',@pivotIN)-1)
					set @strPart2 = SUBSTRING (@pivotIN, CHARINDEX('FROM',@pivotIN), LEN(@pivotIN) - CHARINDEX('FROM',@pivotIN)+ 1)
					SET @pivotIN = @strPart1  +  ' as Mypivot,  0  AS PivotSort INTO ##pivot ' + @strPart2
					--PRINT @pivotIN
					EXEC ( @pivotIN )
					
				END
			ELSE
				BEGIN
					SET @pivotIN = REPLACE(@pivotIN , ' ' , '')
					SET @pivotIN = REPLACE(@pivotIN , '''' , '')
					
					SET @tmpInt = CHARINDEX ( ',', @pivotIN, 1)
					
					IF LEN(@pivotIN) > 0 AND @tmpInt = 0 
						BEGIN
						INSERT @tmpTable (MyPivot) SELECT SUBSTRING (@pivotIN, 1, LEN(@pivotIN) ) AS MyPivot
						END
					ELSE
					BEGIN
						INSERT @tmpTable (MyPivot) SELECT   SUBSTRING (@pivotIN, 1, @tmpInt - 1) 
						SET @tmpOldInt = @tmpInt + 1
						
						SET @tmpInt = CHARINDEX ( ',', @pivotIN, @tmpOldInt)
						WHILE @tmpInt <> 0
						BEGIN
							INSERT @tmpTable (MyPivot) SELECT   SUBSTRING (@pivotIN, @tmpOldInt, @tmpInt - @tmpOldInt)
							SET @tmpOldInt = @tmpInt + 1
							SET @tmpInt = CHARINDEX ( ',', @pivotIN, @tmpOldInt)
						END
						INSERT @tmpTable (MyPivot) SELECT    SUBSTRING (@pivotIN, @tmpOldInt, LEN(@pivotIN) - @tmpOldInt)
					END
					SELECT MyPivot ,  0 AS PivotSort  INTO ##pivot  FROM @tmpTable
				END
	END
ELSE
	BEGIN
		

		EXEC ('SELECT DISTINCT ' + @pivot +  ' as Mypivot,  ' + @SortPivot  +   ' AS PivotSort INTO ##pivot FROM ' + @source + ' WHERE ' 
		+ @pivot + ' Is Not Null '+ @filtr1)
	END

--Заменяем последнюю скобку на END)



--PRINT @func
SELECT @sql='',
@sql1='',
@sql2='',
@sql3='',
@sql4='',
@sql5='',
@sql6='',
@sql7='',
@sql8='',
@sql9='',
@select='SELECT '+ ISNULL(@SelectFields ,isnull(@fields ,'')),  
@func = REVERSE(SUBSTRING (REVERSE (@func ), CHARINDEX ( ')', REVERSE (@func ),1) + 1 , LEN(REVERSE (@func )) - CHARINDEX ( ')', REVERSE (@func ),1)))+ ' END ) '






/*SELECT @delim=CASE Sign( CharIndex('char', data_type)+CharIndex('date', data_type) ) 
WHEN 0 THEN '' ELSE '''' END 
FROM tempdb.information_schema.columns 
WHERE table_name='##pivot' AND column_name='pivot'
*/

SELECT top 1 @delim = CASE ISNUMERIC(Mypivot) WHEN 1 THEN '' ELSE '''' END FROM ##pivot
DECLARE cur_pivot_cursor scroll CURSOR FOR select Mypivot from ##pivot order by PivotSort  

OPEN cur_pivot_cursor

FETCH NEXT FROM cur_pivot_cursor
INTO @pvalue

SET @sqlnum = 1
--покуда не закончились пивоты
WHILE @@FETCH_STATUS = 0

BEGIN

-- итерация складывания полей
SET @sql=@sql + '''' + convert(VARCHAR(100), @pvalue) + ''' = ' + 
stuff(@func,charindex( '(', @func )+1, 0, 'CASE ' + @pivot + 
' WHEN ' + @delim + convert(VARCHAR(100), @pvalue) + @delim + ' THEN ' ) + ' , '

-- измеряем длину строки
SET @sqllen = len(@sql)

-- проверяем, если уже вылазим за предельную длину строки... то
-- 1-й проход
IF @sqllen > 7800 and @sqlnum = 1 
BEGIN
SET @sql1 = @sql
SET @sqlnum = @sqlnum + 1
SET @sql = ''
SET @sqllen = 0
END

-- 2-й проход
IF @sqllen > 7800 and @sqlnum = 2
BEGIN
SET @sql2 = @sql
SET @sqlnum = @sqlnum + 1
SET @sql = ''
SET @sqllen = 0
END

-- 3-й проход
IF @sqllen > 7800 and @sqlnum = 3
BEGIN
SET @sql3 = @sql
SET @sqlnum = @sqlnum + 1
SET @sql = ''
SET @sqllen = 0
END

-- 4-й проход
IF @sqllen > 7800 and @sqlnum = 4
BEGIN
SET @sql4 = @sql
SET @sqlnum = @sqlnum + 1
SET @sql = ''
SET @sqllen = 0
END

-- 5-й проход
IF @sqllen > 7800 and @sqlnum = 5 
BEGIN
SET @sql5 = @sql
SET @sqlnum = @sqlnum + 1
SET @sql = ''
SET @sqllen = 0
END

-- 6-й проход
IF @sqllen > 7800 and @sqlnum = 6
BEGIN
SET @sql6 = @sql
SET @sqlnum = @sqlnum + 1
SET @sql = ''
SET @sqllen = 0
END

-- 7-й проход
IF @sqllen > 7800 and @sqlnum = 7
BEGIN
SET @sql7 = @sql
SET @sqlnum = @sqlnum + 1
SET @sql = ''
SET @sqllen = 0
END

-- 8-й проход
IF @sqllen > 7800 and @sqlnum = 8
BEGIN
SET @sql8 = @sql
SET @sqlnum = @sqlnum + 1
SET @sql = ''
SET @sqllen = 0
END 

-- 9-й проход
IF @sqllen > 7800 and @sqlnum = 9
BEGIN
SET @sql9 = @sql
SET @sqlnum = @sqlnum + 1
SET @sql = ''
SET @sqllen = 0
END 

-- выцарапываем следующую строку
FETCH NEXT FROM cur_pivot_cursor
INTO @pvalue

END

-- курсор больше ненадобен
CLOSE cur_pivot_cursor
DEALLOCATE cur_pivot_cursor

-- дропаем таблицу пивотов
DROP TABLE ##pivot

-- убираем лишнюю запятую в конце всей серии срок
IF len(@sql) > 0
SELECT @sql=left(@sql, len(@sql)-1)
ELSE 
BEGIN
IF LEN(@sql9)>0
SELECT @sql9=left(@sql9, len(@sql9)-1)
ELSE IF LEN(@sql8)>0
SELECT @sql8=left(@sql8, len(@sql9)-1)
ELSE IF LEN(@sql7)>0
SELECT @sql7=left(@sql7, len(@sql7)-1)
ELSE IF LEN(@sql6)>0
SELECT @sql6=left(@sql6, len(@sql6)-1)
ELSE IF LEN(@sql5)>0
SELECT @sql5=left(@sql5, len(@sql5)-1)
ELSE IF LEN(@sql4)>0
SELECT @sql4=left(@sql4, len(@sql4)-1)
ELSE IF LEN(@sql3)>0
SELECT @sql3=left(@sql3, len(@sql3)-1)
ELSE IF LEN(@sql2)>0
SELECT @sql2=left(@sql2, len(@sql2)-1)
ELSE IF LEN(@sql1)>0
SELECT @sql1=left(@sql1, len(@sql1)-1)
END
SET @filtr1=isnull(' WHERE '+@filtr, '')

set @sqlend=isnull(' INTO '+@into,'')+' FROM '+@source+@filtr1+isnull(' GROUP BY '+@fields,'')  + isnull(' Order BY '+@OrderBY,'')   
IF LEN(LTRIM(@sql1+@sql2+@sql3+@sql4+@sql5+@sql6+@sql7+@sql8+@sql9 + @sql ) ) <> 0 BEGIN 
	SET @select = @select + ' , '
END
IF NOT @into IS NULL BEGIN
	--EXECUTE AS LOGIN ='Sergei';
	if exists(SELect * from dbo.sysobjects where id = object_id(@into) and OBJECTPROPERTY(id, N'IsUserTable')=1)BEGIN
		execute (  'drop table ' + @into )
	END
	EXEC (@select+@sql1+@sql2+@sql3+@sql4+@sql5+@sql6+@sql7+@sql8+@sql9+@sql+@sqlend )
	IF CHARINDEX('##', @into) = 0 	execute ('GRANT  SELECT ,  UPDATE ,  INSERT ,  DELETE  ON  ' + @into + ' TO [IntekUser]')
	--REVERT;
END ELSE BEGIN
	EXEC (@select+@sql1+@sql2+@sql3+@sql4+@sql5+@sql6+@sql7+@sql8+@sql9+@sql+@sqlend)
END


SET ANSI_WARNINGS ON


Сообщение было отредактировано: 8 фев 17, 12:42
8 фев 17, 12:33    [20192423]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
SergeiGer,

счастливый конец истории Хатико.... для интересу VARCHAR(8000) а потом дикие танцы это по религиозным сообщениям?
8 фев 17, 12:39    [20192444]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
SergeiGer,

Хоть бы выковыряли всякие ваши Intek-базы и Intek-юзеров; они, как бы, не на каждом сервере есть.
8 фев 17, 12:44    [20192462]     Ответить | Цитировать Сообщить модератору
 Re: Сводные таблицы  [new]
лолл
Member

Откуда:
Сообщений: 450
SergeiGer,

Сейчас так писать мягко говоря не принято, этот код нужно выкинуть.

PS: Название процедуры spGreateCrosstab вместо spCreateCrosstab вызывает удивление
8 фев 17, 13:47    [20192812]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить