Можно ли создать «постоянную» таблицу из результатов хранимой процедуры - PullRequest
0 голосов
/ 23 марта 2012

Я довольно новичок в SQL. Но очень хочется узнать как можно больше. Тем не менее, у меня действительно есть кое-что, что мне нужно сделать для работы (вроде как меня это бросило). Но я продолжаю сталкиваться с препятствиями. Мне нужно создать таблицу, в которой всегда есть информация об обновлении из этой хранимой процедуры, которую я создал. Сначала я пытался объединить таблицы и т. Д., Но просто не смог получить точные данные, которые мне нужны. Наилучший способ, который я нашел для достижения хотя бы правильного сбора данных, - это использовать эту хранимую процедуру. Однако, здесь прибывает другой блокпост; положить его в стол. Причина, по которой мне нужна таблица, заключается в том, что внешнее приложение (разрабатываемое для нашего местоположения) должно иметь эту таблицу для просмотра определенной информации. Он будет смотреть на эту таблицу несколько раз в день, потому что данные могут измениться. Я был бы очень признателен за любую помощь или совет, который может привести меня к решению, в котором я нуждаюсь. Заранее спасибо.

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

    DECLARE @now DATETIME
    SET @now = CONVERT(VARCHAR(8),GETDATE(),108)


    IF @now BETWEEN '06:40:00' AND '14:39:59'
    SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition,   t.ProgramNumber, t.PartNumber,t.Cavity
    FROM tblTransactionDetail t
    JOIN tblLPCurrentOnline c
    on t.Cart=c.Fixture
    AND t.ProgramNumber=c.Program
    AND t.LineNumber=c.Linenumber  
    WHERE Shift = 1 and PartNumber <>''

    ELSE IF @now BETWEEN '14:40:00' AND '22:39:59'
        SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition, t.ProgramNumber, t.PartNumber,t.Cavity
    FROM tblTransactionDetail t
    JOIN tblLPCurrentOnline c
    on t.Cart=c.Fixture
    AND t.ProgramNumber=c.Program
    AND t.LineNumber=c.Linenumber 
    WHERE Shift = 2 AND PartNumber <>''

ELSE IF @now BETWEEN '22:40:00' AND '24:59:59' OR @now BETWEEN '00:00:00' AND '06:39:59'
    SELECT  t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition, t.ProgramNumber, t.PartNumber,t.Cavity
 FROM tblTransactionDetail t
JOIN tblLPCurrentOnline c
on t.Cart=c.Fixture
AND t.ProgramNumber=c.Program
AND t.LineNumber=c.Linenumber 
WHERE Shift = 3 AND PartNumber <>'' 

Ответы [ 3 ]

0 голосов
/ 24 марта 2012

Я думаю, вам не нужно иметь параметр.Я никогда не писал такой запрос, но вы можете сказать «DATEPART (hh, GETDATE ())» и «DATEPART (mm, GETDATE ())», чтобы получить часы и минуты, соответственно.И вы можете включить тесты на то, какой час это в ваших запросах.

Вы можете использовать это, чтобы избавиться от вашего оператора if и параметра.Прямо сейчас у вас есть:

   WHERE Shift = 3 AND PartNumber <>'' 

Концептуально, если бы вы могли сказать «ГДЕ сдвиг = независимо от того, какой сдвиг сейчас », это бы сработало.В SQL вы используете оператор CASE.Есть две формы;Вы можете прочитать об этом в Google, я собираюсь показать форму "искали" ниже.

Если бы это было просто вопросом, две смены, скажем, с полуночи до 14 часов, это 1, а другие времена смены.2, вы хотите знать, если час <14 или нет.Вы могли бы сказать: </p>

  WHERE shift = CASE WHEN DATEPART(hh, GETDATE()) < 14 THEN 1 ELSE 2 END AND partNubmer <> ''

Имеет ли это смысл?В зависимости от того, когда он был запущен, вы получите либо shift = 1, либо shift = 2.

SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition,        t.ProgramNumber, t.PartNumber,t.Cavity
    FROM tblTransactionDetail t
    JOIN tblLPCurrentOnline c
    on t.Cart=c.Fixture
    AND t.ProgramNumber=c.Program
    AND t.LineNumber=c.Linenumber  
    WHERE PartNumber <>'' AND
       CASE WHEN EXPRESSION_THAT_RETURNS_TRUE_DURING_SHIFT_1 THEN 1 
       EXPRESSION_THAT_RETURNS_TRUE_DURING_SHIFT_2 THEN 2
       ELSE 3 END

Здесь, кажется, удобный способ узнать, что такое сдвиг, это спросить: «Что будетчасовая часть текущего времени будет через 20 минут? "И на сервере sql, чтобы получить это число, вы говорите:

      SELECT DATEPART( hh, DATEADD(mi, 20, GETDATE()))

Итак, ваше выражение может быть

    WHERE PartNumber <>'' AND
       CASE WHEN DATEPART( hh, DATEADD(mi, 20, GETDATE())) BETWEEN 7 AND 15 THEN 1 
       WHEN DATEPART( hh, DATEADD(mi, 20, GETDATE())) BETWEEN 16 AND 22 THEN 2 -- 4pm to 11:59:59...
       ELSE 3 END

Надеюсь, это сработает.Вы можете попробовать тесты, указав в качестве части даты секунды, а не часы, ss - символ, используемый для секунд.

0 голосов
/ 25 марта 2012

Я не вижу необходимости в создании хранимой процедуры, если в ней много данных и для ее создания требуется некоторое время.

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

Я не проверял запрос, поэтому если есть какие-либо ошибки, прошу прощения:

CREATE VIEW REQUIREDTABLENAME
AS
    SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition,   t.ProgramNumber, t.PartNumber,t.Cavity  
    FROM tblTransactionDetail t  
    JOIN tblLPCurrentOnline c  
    on t.Cart=c.Fixture  
    AND t.ProgramNumber=c.Program  
    AND t.LineNumber=c.Linenumber    
    WHERE Shift = 
    case 
    when CONVERT(VARCHAR(8),GETDATE(),108)  BETWEEN '06:40:00' AND '14:39:59' then 1 
    when CONVERT(VARCHAR(8),GETDATE(),108)  BETWEEN '14:40:00' AND '22:39:59' then 2 
    when CONVERT(VARCHAR(8),GETDATE(),108)  BETWEEN '22:40:00' AND '24:59:59' OR CONVERT(VARCHAR(8),GETDATE(),108)  BETWEEN '00:00:00' AND '06:39:59' then 3 
    end 
    and PartNumber <>''  
0 голосов
/ 23 марта 2012

Вы можете создать таблицу с результатами любого выбора, сказав «INTO whereever» перед предложением «FROM».Но если таблица существует, вы получите ошибку.Поэтому обычно вы делаете проверку хранимой процедуры, чтобы увидеть, есть ли таблица, удалите (удалите) ее, если она есть, затем запустите запрос.Затем вам нужно организовать выполнение хранимой процедуры перед тем, как запросить ее, если вы хотите, чтобы получаемые вами данные были более или менее «живыми»

Детали варьируются в зависимости от того, какой продукт вы используете, все, что вы пишете, выглядит как функцияимена / соглашения, которые я ассоциирую с Microsoft SQL Server, или, может быть, MySQL, но, пожалуйста, скажите, что вы используете.

Также: Добро пожаловать в StackOverflow, вы должны пометить ваши вопросы точной версией SQL, которую вы используете;прочитайте это, это коротко: https://stackoverflow.com/tags/sql/info.

...