Sql server NewID()函数的澄清
我有一个存储过程,它接受两个类型为Sql server NewID()函数的澄清,sql-server,tsql,rdbms,Sql Server,Tsql,Rdbms,我有一个存储过程,它接受两个类型为UniqueIdentifier 当我通过显式调用NewId()来代替其中一个参数来调用此存储过程时: exec dbo.TestArgs newid, '34131101-04DE-4B97-8FAC-49C924F7BFCE' 它失败于: 将数据类型nvarchar转换为uniqueidentifier时出错 但是将由NewId()填充的变量传递到调用中是可以的: DECLARE @painInTheArse UniqueIdentifier SET @p
UniqueIdentifier
当我通过显式调用NewId()
来代替其中一个参数来调用此存储过程时:
exec dbo.TestArgs newid, '34131101-04DE-4B97-8FAC-49C924F7BFCE'
它失败于:
将数据类型nvarchar转换为uniqueidentifier时出错
但是将由NewId()填充的变量
传递到调用中是可以的:
DECLARE @painInTheArse UniqueIdentifier
SET @painInTheArse = NewID()
EXEC dbo.TestArgs
newid
@painetharse,'34131101-04DE-4B97-8FAC-49C924F7BFCE'
完美地工作
对我来说,这似乎是非常错误的。有人能解释一下吗?传入存储过程的参数必须是常量。看
首先将函数调用的结果放入参数的解决方案是绝对正确的…太好了。谢谢。很这是因为NewID()是确定性的,对吗?不,NewID是不确定性的,getdate()也是如此,但是在这个上下文中的任何函数调用都会被SQL抛出。我很想听听SQL专家的意见,为什么…GETDATE()不是确定性的,因为它总是使用相同的参数调用,但每次调用的结果都不同。这就是为什么不能在UDF中使用它(或任何非确定性)函数的原因。@Wil-yep,newid()也不能吗?但在本例中,我们讨论的是为什么在调用存储过程等时不能将函数用作参数,或者我没有领会您的意思?是的……虽然不能从函数内部调用非确定性函数,但可以将非确定性函数用作参数来调用非确定性函数。:)