列出来自sql server UDF的记录,它返回经典asp中的Table

时间:2015-01-13 00:57:39

标签: sql-server asp-classic ado user-defined-functions

我写了第一个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.

可以提出一些建议吗?

由于 塞尔吉奥

1 个答案:

答案 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”。

希望这有帮助。