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

Откуда: СПб
Сообщений: 270
Всем добрый день!

У меня есть динамический запрос:

DECLARE @cols AS nvarchar(max),
        @cols1 AS nvarchar(max);
			
	WITH ColumnsCTE AS
	(
		SELECT DISTINCT
		ROW_NUMBER() OVER (PARTITION BY cp.MARK_UNT ORDER BY cp.MARK_UNT) AS [Counts]
		FROM dbo.TaskControlPlace cp
	)
	
	SELECT @cols  = ISNULL(@cols + N',[', '[') + 'Place' + CAST([Counts] AS nvarchar(10))+']',
		     @cols1 = ISNULL(@cols1 + ' + ISNULL(''|'' + place' + CAST([Counts] AS nvarchar(10)) + ', '''') ', 'Place' + CAST([Counts] AS nvarchar(10)))
	FROM ColumnsCTE
	ORDER BY [Counts];
		   
	
	DECLARE @sql AS nvarchar(MAX);
	
	SET @sql = N'SELECT
				  MARK_UNT,'
				  + @cols1 +
				N'FROM (SELECT
				  *
				FROM (SELECT
				  cp.MARK_UNT,
				  CAST(cp.CTR_PLACE AS nvarchar(5)) AS CTR_PLACE,
				  ''Place'' + CONVERT(nvarchar(3), ROW_NUMBER() OVER (PARTITION BY MARK_UNT ORDER BY CTR_PLACE)) AS [Place]
				FROM dbo.TaskControlPlace cp
				INNER JOIN dbo.PlaceControl pc
				  ON CTR_PLACE = Ref_TaskCTR
				WHERE cp.CTR_PLACE IS NOT NULL
				AND ISNUMERIC(cp.CTR_PLACE) = 1) t
				PIVOT (
				MIN(CTR_PLACE)
				FOR Place IN (' + @cols + N')
				) p) Q'
	
	EXEC sp_executesql @sql;


Подскажите как его "засунуть" в представление.

У меня MS SQL 2008
7 июл 14, 23:48    [16272517]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Веткин Сергей
Подскажите как его "засунуть" в представление.
Никак.
7 июл 14, 23:59    [16272571]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
Веткин Сергей,

Сделай хранимку. Зачем view.
8 июл 14, 00:43    [16272744]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Веткин Сергей
Подскажите как его "засунуть" в представление.
что значит "засунуть"?

если "в лоб", то вместо
SET @sql = N'SELECT MARK_UNT,' + @cols1
написать
SET @sql = N'CREATE VIEW dbo.test AS SELECT MARK_UNT,' + @cols1
8 июл 14, 01:52    [16272824]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
vso
Member

Откуда: СПб
Сообщений: 270
gandjustas
Сделай хранимку. Зачем view.


а хранимку можно использовать в запросах или только функции можно?
8 июл 14, 09:03    [16273038]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Веткин Сергей
gandjustas
Сделай хранимку. Зачем view.


а хранимку можно использовать в запросах или только функции можно?
Только функции.
8 июл 14, 09:06    [16273044]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
Веткин Сергей
gandjustas
Сделай хранимку. Зачем view.


а хранимку можно использовать в запросах или только функции можно?


Хранимку нельзя, но можно так:
INSERT INTO #tab EXEC MyProc


А если надо без промежуточной таблицы, то передавай предикат внутрь хранимки.
8 июл 14, 09:38    [16273160]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
vso
Member

Откуда: СПб
Сообщений: 270
gandjustas

Хранимку нельзя, но можно так:
INSERT INTO #tab EXEC MyProc


Такое можно делать только со временными таблицами или так же можно сделать и внутри функции возвращающей табличные значения?

Например:

CREATE FUNCTION MyFunc
(
)
RETURNS @RetTable TABLE (
  Field int
)

AS
BEGIN
-- Здесь набор действий

  INSERT INTO @RetTable EXEC sp_executesql @sql

RETURN
END


Просто сейчас не могу проверить, а знать хочется уже сейчас...
8 июл 14, 11:27    [16273881]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Неверная идея выполнять запрос, результатом которого будет непредсказуемое количество столбцов. Совершенно противоестественная. Да еще и поместить PIVOT в функцию.
8 июл 14, 11:33    [16273941]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
Владислав Колосов
Неверная идея выполнять запрос, результатом которого будет непредсказуемое количество столбцов. Совершенно противоестественная. Да еще и поместить PIVOT в функцию.


Почему? Может приложение на выходе разберется нормально с этим.
8 июл 14, 11:55    [16274133]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
Glory
Member

Откуда:
Сообщений: 104760
gandjustas
Почему? Может приложение на выходе разберется нормально с этим.

А что еще кроме отображения один-в-один можно сделать с неизвестным набором данных ?
8 июл 14, 12:04    [16274201]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
Glory
gandjustas
Почему? Может приложение на выходе разберется нормально с этим.

А что еще кроме отображения один-в-один можно сделать с неизвестным набором данных ?

В принципе что угодно.
8 июл 14, 12:15    [16274292]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Владислав Колосов
Неверная идея выполнять запрос, результатом которого будет непредсказуемое количество столбцов.


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

Вот и встает вопрос как "загнать" его или в представление или в функцию.
8 июл 14, 12:16    [16274305]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
Glory
Member

Откуда:
Сообщений: 104760
gandjustas
Glory
пропущено...

А что еще кроме отображения один-в-один можно сделать с неизвестным набором данных ?

В принципе что угодно.

Что угодно что ? Обработать неизвестный набор неизвестными методами для получения неизвестных результатов ?
8 июл 14, 12:30    [16274413]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
Glory
Member

Откуда:
Сообщений: 104760
Веткин Сергей
Конечный результат будет содержать известное кол-во столбцов, а точнее 2.

Зачем тогда динамический запрос ?
8 июл 14, 12:31    [16274418]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Glory
Зачем тогда динамический запрос ?


Чтобы неизвестное кол-во строк преобразовать в одну запись

Например

RefIDRefPlace
23016
23111
555115
456121
555615


в результате получится

RefID Description
23016|111
555115|615
456121


Дальше на клиенте я могу показать в одной строке соответсвующей RefID, набор мест управления.

А не создавать два грида и делать Master-detail, что не вписывается в мой интерфейс
8 июл 14, 13:09    [16274756]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
Glory
gandjustas
пропущено...

В принципе что угодно.

Что угодно что ? Обработать неизвестный набор неизвестными методами для получения неизвестных результатов ?


В отличие от SQL, программный код нормально работает с переменным числом колонок.
8 июл 14, 13:12    [16274780]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
Glory
Member

Откуда:
Сообщений: 104760
Веткин Сергей
Glory
Зачем тогда динамический запрос ?


Чтобы неизвестное кол-во строк преобразовать в одну запись

Нет. Потому что у вас имена полей зависят о количества записей.

А вот для такого примера динамический запрос не нужен
Веткин Сергей
Например

RefIDRefPlace
23016
23111
555115
456121
555615


в результате получится

RefID Description
23016|111
555115|615
456121
8 июл 14, 13:14    [16274792]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
Glory
Member

Откуда:
Сообщений: 104760
gandjustas
В отличие от SQL, программный код нормально работает с переменным числом колонок.

Мда.
Т.е. сам программный код будет решать, что и как я мне видеть в результатах ?
8 июл 14, 13:15    [16274804]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
vso
Member

Откуда: СПб
Сообщений: 270
gandjustas

В отличие от SQL, программный код нормально работает с переменным числом колонок.


Дело не в переменном кол-во колонок, а строк
8 июл 14, 13:18    [16274831]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
Glory
Member

Откуда:
Сообщений: 104760
Веткин Сергей
Дело не в переменном кол-во колонок, а строк

Дело в неумении сфорумлировать задачу.
Задача ваша называется - агрегатная функция для символьных полей.
8 июл 14, 13:20    [16274851]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
Glory
gandjustas
В отличие от SQL, программный код нормально работает с переменным числом колонок.

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


Да, так всегда и происходит. Между базой и реальным пользователем есть прослойка, которая много чего решает.
8 июл 14, 13:39    [16275008]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
Glory
Member

Откуда:
Сообщений: 104760
gandjustas
Да, так всегда и происходит. Между базой и реальным пользователем есть прослойка, которая много чего решает.

Ну так объясните мне, откуда эта прослойка знает как, отображать любой результат с произвольный количеством полей ?
Там ИИ "сидит" ?
8 июл 14, 13:41    [16275021]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
Веткин Сергей
gandjustas
В отличие от SQL, программный код нормально работает с переменным числом колонок.


Дело не в переменном кол-во колонок, а строк


А зачем это делать в SQL и мучатся со склейкой строк? Объем передаваемых данных не уменьшится, оптимизировать что-то на стороне базы тоже не выйдет. На стороне приложения в две строки можно получить нужный результат.
8 июл 14, 13:42    [16275026]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос в представлении  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Чтобы обернуть динамический запрос со всякими DECLARE и прочим кодом во вьюху, нужно сначала обернуть его в функцию c результатом таблица. Пример из MSDN, затем SELECT из этой функции можно обернуть вьюхой.

http://technet.microsoft.com/en-us/library/ms191165(v=sql.105).aspx
USE AdventureWorks2008R2;
GO
IF OBJECT_ID(N'dbo.ufnGetContactInformation', N'TF') IS NOT NULL
    DROP FUNCTION dbo.ufnGetContactInformation;
GO
CREATE FUNCTION dbo.ufnGetContactInformation(@ContactID int)
RETURNS @retContactInformation TABLE 
(
    -- Columns returned by the function
    ContactID int PRIMARY KEY NOT NULL, 
    FirstName nvarchar(50) NULL, 
    LastName nvarchar(50) NULL, 
    JobTitle nvarchar(50) NULL, 
    ContactType nvarchar(50) NULL
)
AS 
-- Returns the first name, last name, job title, and contact type for the specified contact.
BEGIN
    DECLARE 
        @FirstName nvarchar(50), 
        @LastName nvarchar(50), 
        @JobTitle nvarchar(50), 
        @ContactType nvarchar(50);
    -- Get common contact information
    SELECT 
        @ContactID = BusinessEntityID, 
        @FirstName = FirstName, 
        @LastName = LastName
    FROM Person.Person 
    WHERE BusinessEntityID = @ContactID;
    -- Get contact job title
    SELECT @JobTitle = 
        CASE 
            -- Check for employee
            WHEN EXISTS(SELECT * FROM Person.Person AS p 
                        WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'EM') 
                THEN (SELECT JobTitle 
                      FROM HumanResources.Employee AS e
                      WHERE e.BusinessEntityID = @ContactID)
            -- Check for vendor
            WHEN EXISTS(SELECT * FROM Person.Person AS p 
                        WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'VC') 
                THEN (SELECT ct.Name 
                      FROM Person.ContactType AS ct 
                      INNER JOIN Person.BusinessEntityContact AS bec 
                          ON bec.ContactTypeID = ct.ContactTypeID  
                      WHERE bec.PersonID = @ContactID)

            -- Check for store
            WHEN EXISTS(SELECT * FROM Person.Person AS p 
                        WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'SC') 
                THEN (SELECT ct.Name 
                      FROM Person.ContactType AS ct 
                      INNER JOIN Person.BusinessEntityContact AS bec 
                          ON bec.ContactTypeID = ct.ContactTypeID  
                      WHERE bec.PersonID = @ContactID)
            ELSE NULL 
        END;
    -- Get contact type
    SET @ContactType = 
        CASE 
            -- Check for employee
            WHEN EXISTS(SELECT * FROM Person.Person AS p 
                        WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'EM') 
            THEN 'Employee'
            -- Check for vendor
            WHEN EXISTS(SELECT * FROM Person.Person AS p 
                        WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'VC')
            THEN 'Vendor Contact'
            -- Check for store
            WHEN EXISTS(SELECT * FROM Person.Person AS p 
                        WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'SC')
            THEN 'Store Contact'
            -- Check for individual consumer
            WHEN EXISTS(SELECT * FROM Person.Person AS p 
                        WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'IN') 
            THEN 'Consumer'
             -- Check for general contact
            WHEN EXISTS(SELECT * FROM Person.Person AS p 
                        WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'GC') 
            THEN 'General Contact'
        END;
    -- Return the information to the caller
    IF @ContactID IS NOT NULL 
    BEGIN
        INSERT @retContactInformation
        SELECT @ContactID, @FirstName, @LastName, @JobTitle, @ContactType;
    END;
    RETURN;
END;
GO
8 июл 14, 13:49    [16275084]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить