我写了第一个sql Server返回表UDF,因为我认为比使用SP更好 但是,虽然可以轻松地从sql server检索结果..我无法从经典的ASP ADO
获得结果UDF如下:
CREATE FUNCTION dbo.udf_Alert
(
@I nvarchar (30),
@L nvarchar (10)
)
RETURNS TABLE AS RETURN
(
SELECT a.Message, a.Height, a.backgroundColor, a.isFree
from Advice a
join ActiveMessages b on b.MessageID=a.MessageID
join Items i on b.ItemID=i.ItemID
join Sellers s on i.UserID=s.UserID
join Users u on u.UID=s.UID
WHERE
(i.ItemID=@I and a.Active='1' and b.Active='1' and i.active='1' and i.Show='1' and CHARINDEX('ALERT',u.Modules)>0
and a.ValidFrom<GETDATE() and a.ValidTo>GETDATE() and u.PaidUntil>GETDATE() and charindex(@L,a.Languages)>-1 or charindex('all',a.Languages)>-1 )
UNION ALL
SELECT a.Message, a.Height, a.backgroundColor, a.isFree
FROM Advice a, Users u
WHERE u.isFree='1' and a.isFree='1' and (CHARINDEX(@L,a.Languages)>-1 or Charindex('all',a.Languages)>-1)
)
我可以轻松地从SSMS呼叫执行
Select * from dbo.udf_Alert('281F50246','fr')
但是我必须嵌入一个经典的ASP例程,但我找不到这样做的方法..
尝试了SP方法..但是在尝试设置参数时遇到错误: 在这里我尝试了:
sql="Select dbo.udf_Alert('xx','yy')"
dim cmdA
set cmdA = Server.CreateObject("ADODB.Command")
cmdA.ActiveConnection= cn
cmdA.CommandType=4
cmdA.CommandText=sql
cmda.Parameters.Append cmdA.CreateParameter("fd", nvarchar, adParamInput,30, itemID)
cmda.Parameters.Append cmdA.CreateParameter("fde", nvarchar, adParamInput,10, LanguageID)
' cmdA.Parameters("@I")=ItemID '<-----ERRROR HERE
' cmdA.Parameters("@L")=LanguageID
set rs=cmdA.Execute()
所以我尝试以其他方式设置参数...但结果相同:
ADODB.Command error '800a0bb9'
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
可以提出一些建议吗?
由于 塞尔吉奥
答案 0 :(得分:0)
我们倾向于一对一地为UDF创建存储过程“包装器”,可以直接从Web代码调用它。对于您的示例,这可能看起来像
CREATE PROCEDURE [dbo].[pr_Alert]
@I nvarchar (30),
@L nvarchar (10)
AS
SELECT * FROM testDb.dbo.udf_Alert(@I, @L)
RETURN
您的commandText将只是包装器SP的名称“pr_Alert”。
希望这有帮助。