#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 у вас есть какие-либо успехи?