SQL Azure — тип столбца «» конфликтует с типом других столбцов, указанных в списке НЕДОСТУПНЫХ

#azure-sql-database #unpivot

#azure-sql-database #отключенный

Вопрос:

мы переносим наши хранимые процедуры Sql Server на Sql Azure. При попытке создать хранимую процедуру в Sql Azure мы получаем ошибку ниже

Сообщение об ошибке: Сообщение об ошибке 8167, уровень 16, состояние 1, процедура SP_Get_EmployeeGeneralDetails, строка 64 [Строка запуска пакета 6] Тип столбца «EmployeeName» конфликтует с типом других столбцов, указанных в списке НЕЖЕЛАТЕЛЬНЫХ.

Сценарий SP:

 CREATE PROCEDURE [dbo].[SP_Get_EmployeeGeneralDetails]
(
 @moduleID INT
,@templateID INT
,@employeeId INT
,@locationID INT
,@applicationID INT
,@culture NVARCHAR(20)
,@letterBody NVARCHAR(MAX) OUTPUT
)
WITH ENCRYPTION
AS
BEGIN

    DECLARE @typeId INT

    SELECT  @typeId = TypeId
    FROM    tCultureMaster
    WHERE   CultureCode = @culture
   
    DECLARE @symbolChangeTable TABLE
        (
         [Key] NVARCHAR(MAX)
        ,[Value] NVARCHAR(MAX)
        )
   
    INSERT  INTO @symbolChangeTable
            SELECT  [Key]
                   ,[Value]
            FROM    ( SELECT    CONVERT(NVARCHAR(MAX), GETDATE(),107) AS [Date]
                               ,CONVERT(NVARCHAR(MAX), ve.FullName) AS EmployeeName
                                                   --,ve.FullName AS EmployeeName  ,CONVERT(NVARCHAR(MAX), ve.FullName) AS EmployeeName
                               ,CASE @typeId
                                  WHEN 1
                                  THEN CONVERT(NVARCHAR(MAX), ve.Designation) /*English*/
                                  ELSE CONVERT(NVARCHAR(MAX), ve.DesignationArabic) /*Arabic*/
                                END AS Designation   --Column Name
                               ,CASE @typeId
                                  WHEN 1
                                  THEN CONVERT(NVARCHAR(MAX), ve.Department) /*English*/
                                  ELSE CONVERT(NVARCHAR(MAX), ve.DepartmentArabic) /*Arabic*/
                                END AS Department   --Column Name
                               ,CONVERT(NVARCHAR(MAX), l.CompanyName) AS CompanyName
                               ,CONVERT(NVARCHAR(MAX), te.LastPromotionDate) AS LastPromotionDate
                               ,CONVERT(NVARCHAR(MAX), veHr.FullName) AS HRAdmin
                      FROM      tEmployee te
                                INNER JOIN dbo.v_Employees ve ON ve.EmployeeID = te.EmployeeId
                                INNER JOIN dbo.tLocation l ON l.LocationCode = te.LocationId
                                INNER JOIN dbo.v_Employees veHR ON veHR.EmployeeID = l.HRManager
                      WHERE     te.EmployeeId = @employeeId
                                AND te.LocationId = @locationID
                    ) pvt UNPIVOT
            ( [Value] FOR [Key] IN ( [Date], EmployeeName, Designation,
                                     Department, CompanyName,
                                     LastPromotionDate, HRAdmin
                                      ) ) AS unpvt

    --Common Section for all Modules   

    DECLARE @body NVARCHAR(MAX)

    SELECT  @body = Body
    FROM    tLetterTemplates lt
    WHERE   TemplateID = @templateID
            AND ModuleID = @moduleID
           

    DECLARE @key NVARCHAR(MAX)
       ,@value NVARCHAR(MAX)

    DECLARE cur_SymbolList CURSOR FOR SELECT  [Key], [Value]
    FROM    @symbolChangeTable

    OPEN cur_SymbolList
    FETCH NEXT FROM cur_SymbolList INTO @key, @value

    WHILE @@fetch_status = 0
        BEGIN
            SET @body = REPLACE(CAST(@body AS NVARCHAR(MAX)),
                                '#'   @key   '#', @value) ;
            FETCH NEXT FROM cur_SymbolList INTO @key, @value
        END

    SET @letterBody = @body ;    

    --PRINT @body ;
    --SELECT  @body;
END
 

Эта хранимая процедура создается корректно на Sql Server, но выдает ошибку в SQL Azure.

Все столбцы в UnPivot имеют одинаковый тип, NVARCHAR(MAX)

Комментарии:

1. Немного странно, что я попробовал ваш скрипт, и в моей базе данных SQL Azure нет ошибок.

2. Привет, Леон, спасибо за твои усилия. Мы новички в SQL Azure. Не могли бы вы сообщить нам, есть ли какая-либо версия / издание / конфигурация, которую нам нужно искать в SQL Azure. Возможно, в вашей и нашей среде существуют различия, из-за которых проблема возникает в нашей SQL Azure, а не в вашей.

3. Моя база данных SQL Azure имеет версию V12.0.2000.8. Я ничего не устанавливал только с настройками по умолчанию.

4. Я запускаю его в SSMS.

5. пожалуйста, поделитесь своим примером сценария, который вы выполнили, и ошибок не было. Спасибо.

Ответ №1:

Я могу запустить этот скрипт в базе данных SQL Azure и без каких-либо ошибок. Пожалуйста, посмотрите на скриншот: введите описание изображения здесь

Моя база данных SQL Azure имеет версию V12.0.2000.8. Я ничего не устанавливал только с настройками по умолчанию.

Скрипт скопирован с вашего вопроса:

 CREATE PROCEDURE [dbo].[SP_Get_EmployeeGeneralDetails]
(
 @moduleID INT
,@templateID INT
,@employeeId INT
,@locationID INT
,@applicationID INT
,@culture NVARCHAR(20)
,@letterBody NVARCHAR(MAX) OUTPUT
)
WITH ENCRYPTION
AS
BEGIN

    DECLARE @typeId INT

    SELECT  @typeId = TypeId
    FROM    tCultureMaster
    WHERE   CultureCode = @culture
   
    DECLARE @symbolChangeTable TABLE
        (
         [Key] NVARCHAR(MAX)
        ,[Value] NVARCHAR(MAX)
        )
   
    INSERT  INTO @symbolChangeTable
            SELECT  [Key]
                   ,[Value]
            FROM    ( SELECT    CONVERT(NVARCHAR(MAX), GETDATE(),107) AS [Date]
                               ,CONVERT(NVARCHAR(MAX), ve.FullName) AS EmployeeName
                                                   --,ve.FullName AS EmployeeName  ,CONVERT(NVARCHAR(MAX), ve.FullName) AS EmployeeName
                               ,CASE @typeId
                                  WHEN 1
                                  THEN CONVERT(NVARCHAR(MAX), ve.Designation) /*English*/
                                  ELSE CONVERT(NVARCHAR(MAX), ve.DesignationArabic) /*Arabic*/
                                END AS Designation   --Column Name
                               ,CASE @typeId
                                  WHEN 1
                                  THEN CONVERT(NVARCHAR(MAX), ve.Department) /*English*/
                                  ELSE CONVERT(NVARCHAR(MAX), ve.DepartmentArabic) /*Arabic*/
                                END AS Department   --Column Name
                               ,CONVERT(NVARCHAR(MAX), l.CompanyName) AS CompanyName
                               ,CONVERT(NVARCHAR(MAX), te.LastPromotionDate) AS LastPromotionDate
                               ,CONVERT(NVARCHAR(MAX), veHr.FullName) AS HRAdmin
                      FROM      tEmployee te
                                INNER JOIN dbo.v_Employees ve ON ve.EmployeeID = te.EmployeeId
                                INNER JOIN dbo.tLocation l ON l.LocationCode = te.LocationId
                                INNER JOIN dbo.v_Employees veHR ON veHR.EmployeeID = l.HRManager
                      WHERE     te.EmployeeId = @employeeId
                                AND te.LocationId = @locationID
                    ) pvt UNPIVOT
            ( [Value] FOR [Key] IN ( [Date], EmployeeName, Designation,
                                     Department, CompanyName,
                                     LastPromotionDate, HRAdmin
                                      ) ) AS unpvt

    --Common Section for all Modules   

    DECLARE @body NVARCHAR(MAX)

    SELECT  @body = Body
    FROM    tLetterTemplates lt
    WHERE   TemplateID = @templateID
            AND ModuleID = @moduleID
           

    DECLARE @key NVARCHAR(MAX)
       ,@value NVARCHAR(MAX)

    DECLARE cur_SymbolList CURSOR FOR SELECT  [Key], [Value]
    FROM    @symbolChangeTable

    OPEN cur_SymbolList
    FETCH NEXT FROM cur_SymbolList INTO @key, @value

    WHILE @@fetch_status = 0
        BEGIN
            SET @body = REPLACE(CAST(@body AS NVARCHAR(MAX)),
                                '#'   @key   '#', @value) ;
            FETCH NEXT FROM cur_SymbolList INTO @key, @value
        END

    SET @letterBody = @body ;    

    --PRINT @body ;
    --SELECT  @body;
END
 

Комментарии:

1. извините, Леон, глядя на снимок экрана, которым вы поделились, кажется, что вы разобрали сценарий, и он не выдал ошибки. Для нас тоже parse не выдает ошибку. При выполнении скрипта возникает ошибка (F5).

2. @shoab Я нажимаю Execute , чтобы запустить скрипт. Вы использовали SSMS? Пожалуйста, попробуйте.

3. @shoab у вас есть какие-либо успехи?