Как изменить временную таблицу внутри курсора? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть данные временной таблицы в sql. Мне нужно изменить данные в этой таблице.

Пожалуйста, найдите прикрепленный снимок enter image description here

Мне нужно, чтобы col имел данные за месяц, например, 01-03 января это код, который я написал. Это не работает:

DECLARE @month VARCHAR(50) -- month
DECLARE @year VARCHAR(256) -- year
DECLARE @monthf VARCHAR(256) -- year
DECLARE @months VARCHAR(256) -- year

DECLARE db_cursor CURSOR FOR 
SELECT months,[year] FROM #temp where len(months)>4

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @month,@year  

WHILE @@FETCH_STATUS = 0  
BEGIN  

    IF SUBSTRING(@month,0,3) = '01'
    set @monthf='Jan'      
    ELSE IF SUBSTRING(@month,0,3) = '02'
    set @monthf='Feb'
    ELSE IF SUBSTRING(@month,0,3) = '03'
    set @monthf='Mar'
    ELSE IF SUBSTRING(@month,0,3) = '04'
    set @monthf='Apr'
    ELSE IF SUBSTRING(@month,0,3) = '05'
    set @monthf='May'
    ELSE IF SUBSTRING(@month,0,3) = '06'
    set @monthf='Jun'
    ELSE IF SUBSTRING(@month,0,3) = '07'
    set @monthf='Jul'
    ELSE IF SUBSTRING(@month,0,3) = '08'
    set @monthf='Aug'
    ELSE IF SUBSTRING(@month,0,3) = '09'
    set @monthf='Sep'
    ELSE IF SUBSTRING(@month,0,3) = '10'
    set @monthf='Oct'
    ELSE IF SUBSTRING(@month,0,3) = '11'
    set @monthf='Nov'
    ELSE IF SUBSTRING(@month,0,3) = '12'
    set @monthf='Dec'

    IF SUBSTRING(@month,4,2) = '01'
    set @months='Jan'      
    ELSE IF SUBSTRING(@month,4,2) = '02'
    set @months='Feb'
    ELSE IF SUBSTRING(@month,4,2) = '03'
    set @months='Mar'
    ELSE IF SUBSTRING(@month,4,2) = '04'
    set @months='Apr'
    ELSE IF SUBSTRING(@month,4,2) = '05'
    set @months='May'
    ELSE IF SUBSTRING(@month,4,2) = '06'
    set @months='Jun'
    ELSE IF SUBSTRING(@month,4,2) = '07'
    set @months='Jul'
    ELSE IF SUBSTRING(@month,4,2) = '08'
    set @months='Aug'
    ELSE IF SUBSTRING(@month,4,2) = '09'
    set @months='Sep'
    ELSE IF SUBSTRING(@month,4,2) = '10'
    set @months='Oct'
    ELSE IF SUBSTRING(@month,4,2) = '11'
    set @months='Nov'
    ELSE IF SUBSTRING(@month,4,2) = '12'
    set @months='Dec'


      update #temp set [Month]= where months=

      Delete from #temp where months=SUBSTRING(@month,0,3) and [Year]=@year
      Delete from #temp where months=SUBSTRING(@month,4,2) and [Year]=@year  


      FETCH NEXT FROM db_cursor INTO @month,@year   
END 

CLOSE db_cursor  
DEALLOCATE db_cursor

Мне нужен еще один столбец с названиями месяцев, например: для 01-03 он должен давать jan-mar Можете ли вы помочь мне? Мне нужен отдельный столбец для данных строки месяца.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вам вообще не нужен курсор.

IF OBJECT_ID('tempdb..#Data') IS NOT NULL
    DROP TABLE #Data

CREATE TABLE #Data (
    Month VARCHAR(100),
    ResultMonthText VARCHAR(100))

INSERT INTO #Data (
    Month)
VALUES
    ('01-03'),
    ('07'),
    ('03'),
    ('03-05'),
    ('05-09'),
    ('02')

;WITH ParsedMonths AS
(
    SELECT
        D.Month,
        D.ResultMonthText,
        First = CONVERT(INT, SUBSTRING(D.Month, 1, 2)),
        Second = CONVERT(INT, NULLIF(SUBSTRING(D.Month, 4, 2), ''))
    FROM
        #Data AS D
),
MonthNames AS
(
    SELECT
        D.Month,
        D.ResultMonthText,
        FirstAsName = SUBSTRING(
            DATENAME(
                MONTH, 
                DATEADD(MONTH, D.First, 0) - 1 ),
            1,
            3),
        SecondAsName = SUBSTRING(
            DATENAME(
                MONTH, 
                DATEADD(MONTH, D.Second, 0) - 1 ),
            1,
            3)
    FROM
        ParsedMonths AS D
)
UPDATE D SET
    ResultMonthText = D.FirstAsName + ISNULL('-' + D.SecondAsName, '')
FROM
    MonthNames AS D



SELECT
    *
FROM
    #Data AS D

/*
Result:

    Month   ResultMonthText
    ------- ------------
    01-03   Jan-Mar
    07      Jul
    03      Mar
    03-05   Mar-May
    05-09   May-Sep
    02      Feb

*/

РЕДАКТИРОВАТЬ: Сделайте это, если вы все еще хотите держать курсор (хотя я настоятельно рекомендую вам прекратить использовать их, когда вы можете):

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @month,@year  

WHILE @@FETCH_STATUS = 0  
BEGIN 

    DECLARE @FirstMonthNumber INT = CONVERT(INT, SUBSTRING(@month, 1, 2))
    DECLARE @SecondMonthNumber INT = CONVERT(INT, NULLIF(SUBSTRING(@month, 4, 2), ''))

    DECLARE @FirstMonthText VARCHAR(10) = SUBSTRING(
        DATENAME(
            MONTH, 
            DATEADD(MONTH, @FirstMonthNumber, 0) - 1 ),
        1,
        3)

    DECLARE @SecondMonthText VARCHAR(10) = SUBSTRING(
        DATENAME(
            MONTH, 
            DATEADD(MONTH, @SecondMonthNumber, 0) - 1 ),
        1,
        3)

    update #temp set 
        YourNewMonthColumn = @FirstMonthText + ISNULL('-' + @SecondMonthText, '')
    WHERE
        months = @month

    FETCH NEXT FROM db_cursor INTO @month,@year

END

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

0 голосов
/ 02 мая 2018

Может быть

update #temp set [Month] = @monthf where months = @months
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...