Это работает:
Dim rst As New ADODB.Recordset
rst.Open "SELECT * FROM dbo.ftblTest(1,2,3)", CP.Connection, adOpenKeyset, adLockReadOnly
Но было бы лучше сделать это:
rst.Open "SELECT * FROM dbo.ftblTest(@Param1=1,@Param2=2,@Param3=3)", CP.Connection, adOpenKeyset, adLockReadOnly
Если я попробую второй метод, я получу ошибку: "параметры не были предоставлены дляфункция ftblTest "
Можно ли использовать именованные параметры с табличными функциями с несколькими операторами?
Редактировать 1: Примеры, добавленные с использованием объекта команды
Сначала SQL
create function ftblTest (@Input int)
RETURNS @Results TABLE (
OutputField int
)
AS
BEGIN
INSERT INTO @Results SELECT @Input
Return
End
Некоторый код (запускается из ADP Access 2003, с подключением к правильной базе данных SQL)
Public Sub test()
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command
'method 1 works
rst.Open "SELECT * FROM dbo.ftblTest(2)", CurrentProject.Connection, adOpenKeyset, adLockReadOnly
Debug.Print rst.Fields(0)
rst.Close
With cmd
.ActiveConnection = CurrentProject.Connection
.CommandType = adCmdTable
'method 2 works
.CommandText = "dbo.ftblTest(3)"
Set rst = cmd.Execute
Debug.Print rst.Fields(0)
'method 3 fails
.CreateParameter "@Input", adInteger, adParamInput, , 4
.CommandText = "dbo.ftblTest(@Input)"
Set rst = cmd.Execute 'error here:-2147217900 Must declare the scalar variable "@Input".
Debug.Print rst.Fields(0)
End With
End Sub
Как заставить именованные параметры работать в методе 3?
Редактировать 2: тестовый код изменен для использования Parameters.Append
Public Sub test()
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim p As New ADODB.Parameter
With cmd
.ActiveConnection = CurrentProject.Connection
.CommandType = adCmdTable
'Parameter Append method fails
p = .CreateParameter("@Input", adInteger, adParamInput, , 4)
Debug.Print p.Name, p.Type = adInteger, p.Direction = adParamInput, p.SIZE, p.Value 'note that name not set!
With p
.Name = "@Input"
.Type = adInteger
.Direction = adParamInput
.SIZE = 4 'this shouldn't be needed
.Value = 4
End With
Debug.Print p.Name, p.Type = adInteger, p.Direction = adParamInput, p.SIZE, p.Value 'properties now set
.Parameters.Append p
.CommandText = "dbo.ftblTest(@Input)"
Set rst = cmd.Execute 'error here:-2147217900 Must declare the scalar variable "@Input".
Debug.Print rst.Fields(0)
End With
End Sub
это все еще не работает.
Редактировать 3: я удалил @ из параметра создания
, как предложено, и попробовал 3 способа CommandText и получил 3 различных ошибки:
.CommandText = "dbo.ftblTest"
ошибка: параметры не были предоставлены для функции 'dbo.ftblTest'.
.CommandText = "dbo.ftblTest()"
ошибка: для процедуры или функции dbo.ftblTest было предоставлено недостаточное количество аргументов.
.CommandText = "dbo.ftblTest(Input)"
Ошибка: «Ввод» не является опознанной табличной подсказкой.Если он предназначен в качестве параметра для табличной функции или функции CHANGETABLE, убедитесь, что для режима совместимости вашей базы данных установлено значение 90.