Я знаю, что вокруг Stack Overflow существует много похожих вопросов, но никто из них не может ответить на мою проблему.Ошибка конверсии при преобразовании из символьной строки в ошибку uniqueidentifier
Это строка из моей хранимой процедуры:
SET @AdIDNumber = PARSENAME(REPLACE(@AdIDNumber, '-', '.'), 1);
ADIDNumber
является параметром передается в этой хранимой процедуры. Я пытаюсь получить последний компонент ADIDNumber
nvarchar
, разделенный '-'
. Я получаю следующую ошибку:
Conversion failed when converting from a character string to uniqueidentifier.
Странная вещь, это происходит не каждый раз. Вот некоторые ADIDNumbers
, которые работают:
188CR-000O-000199
188CR-000D-000105
и некоторые, которые вызывают ошибку:
188CR-000A-000505
188CR-000S-001459
Что я делаю неправильно? Пожалуйста помоги.
спасибо.
EDIT:
Здесь вся моя хранимая процедура:
ALTER PROCEDURE [dbo].[sp_getOutlookDetails]
-- Add the parameters for the stored procedure here
@CountryName nvarchar(max),
@CommunityName nvarchar(max),
@AdIDNumber nvarchar(max)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @dbName nvarchar(max);
-- remove spaces
SET @CountryName = LOWER(REPLACE(@CountryName, ' ', ''));
SET @CommunityName = LOWER(REPLACE(@CommunityName, ' ', ''));
SET @dbName = @CountryName;
IF @CommunityName IS NOT NULL
SET @dbName = @dbName+'_'[email protected];
IF DB_ID(@dbname) IS NULL
BEGIN
RAISERROR('Database not found',16,1)
RETURN
END
DECLARE @tab AS TABLE (AdName nvarchar(max), OwnerJALName nvarchar(max), OwnerEmail nvarchar(max), AdContactEmail nvarchar(max),
AdWebsiteLink nvarchar(max), Ad1stPhone nvarchar(max), Ad2ndPhone nvarchar(max), VideoUrl nvarchar(max),
AdBusinessType nvarchar(max), AdBusinessLocation nvarchar(max),
PublishStatus INTEGER, MediaGalleryEnabled INTEGER, MapTabEnabled nvarchar(max),
MapCategory nvarchar(max), VMEnabled INTEGER);
-- format the PostID
SET @AdIDNumber = PARSENAME(REPLACE(@AdIDNumber, '-', '.'), 1);
-- we fill the table with LocationCoordinates in the MapCategory column twice so we can replace it later
DECLARE @dynsql nvarchar(max);
DECLARE @PostIDInt INTEGER;
SET @PostIDInt = CAST(@AdIDNumber AS INTEGER);
SET @dynsql = N'USE '+ QUOTENAME(@dbname) + N' SELECT dbo.cs_Posts.Subject, dbo.cs_Users.UserName, dbo.cs_Users.Email, dbo.drive_DirectoryPosts.ContactEmail,
dbo.drive_DirectoryPosts.ContactWebsite, dbo.drive_DirectoryPosts.ContactPhone, dbo.drive_DirectoryPosts.ContactPhoneOther, dbo.drive_DirectoryPosts.VideoUrl,
dbo.drive_DirectoryPosts.ContactBusinessType, dbo.drive_DirectoryPosts.ContactBusinessLocation,
dbo.drive_DirectoryPosts.IsActive, dbo.drive_DirectoryPosts.IsMediaGalleryActive,
dbo.drive_DirectoryPosts.LocationCoordinates, dbo.drive_DirectoryPosts.LocationCoordinates, dbo.drive_DirectoryPosts.IsMediaGalleryActive
FROM dbo.drive_DirectoryPosts INNER JOIN
dbo.cs_Posts ON dbo.drive_DirectoryPosts.PostID = dbo.cs_Posts.PostID INNER JOIN
dbo.cs_Users ON dbo.cs_Posts.UserID = dbo.cs_Users.UserID
WHERE dbo.cs_Posts.PostID = @PostIDInt';
INSERT INTO @tab EXECUTE sp_executesql @dynsql, N'@PostIDInt INTEGER', @PostIDInt = @PostIDInt;
DECLARE @MapCategory nvarchar(max);
DECLARE @VMEnabled INTEGER;
EXEC [dbo].sp_getMapCategory @dbName, @PostIDInt, @MapCategory OUTPUT, @VMEnabled OUTPUT;
UPDATE @tab SET MapCategory = @MapCategory;
UPDATE @tab SET VMEnabled = @VMEnabled;
SELECT * FROM @tab;
Вы злоупотребляете 'PARSENAME' - это не предназначено для общего анализа. –
Хорошо, спасибо за ответ. Это будет причиной этой ошибки? Что я должен использовать вместо этого? Incase вы не можете сказать им новый для всего этого материала SQL. – JDx
Я не думаю, что вы показали достаточно кода. Он жалуется на проблему, обращаясь к 'uniqueidentifier', но я не думаю, что' @ AdIDNumber' может быть объявлен как таковой, поскольку в противном случае вы не могли получить например '188CR-000D-000105' там, в первую очередь. –