Как мне «объявить скалярную переменную» в VIEW в Sql Server (2005) - PullRequest
11 голосов
/ 13 августа 2010

Я пытаюсь создать VIEW в SQL Server 2005.

Код SQL работает как таковой (я использую его в VS2008), но в SQL Server я не могу сохранить его, так как появляется сообщение об ошибке «Объявить скалярную переменную @StartDate» и «Объявить скалярную переменную @EndDate».

Вот код:

WITH Calendar AS (SELECT     CAST(@StartDate AS datetime) AS Date
     UNION ALL
     SELECT     DATEADD(d, 1, Date) AS Expr1
     FROM         Calendar AS Calendar_1
     WHERE     (DATEADD(d, 1, Date) < @EndDate))
    SELECT     C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers]
     FROM         Calendar AS C CROSS JOIN
                            dbo.Country AS C2 LEFT OUTER JOIN
                            dbo.Requests AS R ON C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID
     GROUP BY C.Date, C2.Country

И мой вопрос, конечно, - как именно я должен их объявить?

Я пытался поместить в код следующее:

DECLARE @StartDate smalldatetime
DECLARE @EndDate smalldatetime

Но это не сработало, как я и ожидал - оно только дало мне другое всплывающее сообщение:

«Конструкция или оператор SQL объявления курсора не поддерживаются».

Ответы [ 4 ]

12 голосов
/ 13 августа 2010

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

Короче говоря, синтаксис будет выглядеть примерно так:

CREATE FUNCTION dbo.GetForPeriod
    ( @StartDate datetime, @EndDate datetime) 
RETURNS TABLE 
RETURN 
   SELECT  [[ your column list ]]
   FROM    [[ table list]
   WHERE   [[some column] BETWEEN @StartDate AND @EndDate

У вас может быть один запрос выбора (как бы он ни был сложен, можно использовать CTE).И тогда вы будете использовать его как

SELECT * FROM dbo.GetForPeriod('1-Jan-2010', '31-Jan-2010')
2 голосов
/ 13 августа 2010

Если под VIEW вы подразумеваете собственное представление SQL Server (CREATE VIEW ...), то вы вообще не можете использовать локальные переменные (вместо этого вы должны использовать табличное значение udf).

Если вы имеете в виду что-то еще, то добавление DECLARE @StartDate DATETIME, @EndDate DATETIME делает этот синтаксический анализ в порядке, это полный SQL?

1 голос
/ 12 декабря 2017

Вот пример запроса, который использует CTE, чтобы эмулировать построение внутренней переменной.Вы можете протестировать его в своей версии SQL Server.

CREATE VIEW vwImportant_Users AS
WITH params AS (
    SELECT 
    varType='%Admin%', 
    varMinStatus=1)
SELECT status, name 
    FROM sys.sysusers, params
    WHERE status > varMinStatus OR name LIKE varType

SELECT * FROM vwImportant_Users

и получить вывод:

status  name
12      dbo
0       db_accessadmin
0       db_securityadmin
0       db_ddladmin

также через JOIN

WITH params AS ( SELECT varType='%Admin%', varMinStatus=1)
SELECT status, name 
    FROM sys.sysusers INNER JOIN params ON 1=1
    WHERE status > varMinStatus OR name LIKE varType

также черезCROSS APPLY

WITH params AS ( SELECT varType='%Admin%', varMinStatus=1)
SELECT status, name 
    FROM sys.sysusers CROSS APPLY params
    WHERE status > varMinStatus OR name LIKE varType
0 голосов
/ 20 июля 2016

попробуйте заменить все свои @X, @Y на A.X и A.Y, добавьте в свой код: ОТ (ВЫБЕРИТЕ X = 'literalX', Y = 'literalY') A тогда вы поместили все свои литералы в одно место и получили только одну их копию.

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