列出 sql 服务器 UDF 中 returns Table 在经典 asp 中的记录
list records from sql server UDF that returns Table in classic asp
我写了我的第一个 sql 服务器返回 table UDF 因为我认为比使用 SP 更好
但是,虽然可以很容易地从 sql 服务器检索结果。我无法从经典 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.
可以提出一些建议吗?
谢谢
塞尔吉奥
我们倾向于在一对一的基础上为 UDF 创建存储过程 "wrappers",可以直接从 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"。
希望对您有所帮助。
我写了我的第一个 sql 服务器返回 table UDF 因为我认为比使用 SP 更好 但是,虽然可以很容易地从 sql 服务器检索结果。我无法从经典 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.
可以提出一些建议吗?
谢谢 塞尔吉奥
我们倾向于在一对一的基础上为 UDF 创建存储过程 "wrappers",可以直接从 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"。
希望对您有所帮助。