2012-03-13 5 views
0

Я знаю, что вокруг Stack Overflow существует много похожих вопросов, но никто из них не может ответить на мою проблему.Ошибка конверсии при преобразовании из символьной строки в ошибку uniqueidentifier

Это строка из моей хранимой процедуры:

SET @AdIDNumber = PARSENAME(REPLACE(@AdIDNumber, '-', '.'), 1); 

ADIDNumber является параметром передается в этой хранимой процедуры. Я пытаюсь получить последний компонент ADIDNumbernvarchar, разделенный '-'. Я получаю следующую ошибку:

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; 
+0

Вы злоупотребляете 'PARSENAME' - это не предназначено для общего анализа. –

+0

Хорошо, спасибо за ответ. Это будет причиной этой ошибки? Что я должен использовать вместо этого? Incase вы не можете сказать им новый для всего этого материала SQL. – JDx

+0

Я не думаю, что вы показали достаточно кода. Он жалуется на проблему, обращаясь к 'uniqueidentifier', но я не думаю, что' @ AdIDNumber' может быть объявлен как таковой, поскольку в противном случае вы не могли получить например '188CR-000D-000105' там, в первую очередь. –

ответ

-1

Это было вызвано процедурой sp_getMapCategory сохраняются.

0

Может быть что-то вроде этого:

DECLARE @AdIDNumber VARCHAR(MAX) 
SET @AdIDNumber='188CR-000O-000199' 
DECLARE @REVERSE VARCHAR(MAX)=REVERSE(@AdIDNumber) 
select REVERSE(LEFT(@REVERSE,CHARINDEX('-',@REVERSE)-1)) 
+0

Ум. Это измеряет расстояние от начала строки до символа * first * '-', а затем использует это, чтобы подсчитать количество символов, чтобы сохранить их с правой стороны. Это звучит не так. –

+0

Не видел этого. Извини за это. Обновлен ответ – Arion

Смежные вопросы

 Смежные вопросы