我有这个存储过程:
ALTER PROCEDURE [dbo].[_Doc_GetDoc]
@Id uniqueidentifier
AS
BEGIN
DECLARE @RetVal INT,
@TranCount INT
BEGIN TRY
IF (ISNUll(@Id, '') = '')
RETURN 1002
ELSE
BEGIN
SELECT .....
FROM Documents WITH (nolock)
WHERE Documents.Id = @Id
AND ISNULL(Documents.IsDeleted, 0) = 0
SET @RetVal = 1
END
END TRY
BEGIN CATCH
PRINT error_message()
SET @RetVal= 9999
END CATCH
RETURN @RetVal
END
当我像这样运行时:
USE [xxxxxxxx]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[_Doc_GetDoc]
@Id = 6666a6c6-6666-e966-67a9-a5bf52222d44
SELECT 'Return Value' = @return_value
GO
我收到此错误:
Msg 102,Level 15,State 1,Line 7
'6666a6c6'附近的语法不正确。
如果我在单引号中传递@Id
,则会显示Conversion failed when converting from a character string to uniqueidentifier
我试过了:
exec [dbo].[_Doc_GetDocument] '6666a6c6-6666-e966-67a9-a5bf52222d44'
exec [dbo].[_Doc_GetDocument] @DocId='6666a6c6-6666-e966-67a9-a5bf52222d44'
但同样的错误:从字符串转换为uniqueidentifier时转换失败。
答案 0 :(得分:1)
你的失败在这里:
if(ISNUll(@Id,'')='')
如果将引用引用参数传递给isnull,则输入(第一个参数)将被视为字符串。试试这个:
编辑:
if @Id IS NULL
更多,我注意到您的alter procedure
正在调用[dbo].[_Doc_GetDoc]
,但您尝试执行exec [dbo].[_Doc_GetDocument]
。确保你正在调用正确的,并使用正方形而不是引号作为你的ID参数:
exec [dbo].[_Doc_GetDoc] [6666a6c6-6666-e966-67a9-a5bf52222d44]
答案 1 :(得分:1)
uniqueidentifier数据类型的字符类型比precedence高,因此SQL Server将在此比较操作期间尝试将字符值转换为uniqueidentifier:
Id
如果SELECT 'oops'
WHERE CAST('6666a6c6-6666-e966-67a9-a5bf52222d44' AS uniqueidentifier) = 'foobar';
列包含无法转换的值,则操作将失败,并显示转换错误。例如:
uniqueidentifier
因此,表中的GUID字符串值似乎无效。最佳做法是将列数据类型更改为Feedback
以避免问题继续进行。这将需要修复现有的不良数据。