sql - Delphi - 将表值参数传递给 SQL Server 存储过程

标签 sql sql-server delphi stored-procedures

我需要将参数作为 SQL Server 中存储过程的表值传递。在Delphi中如何处理这个问题?

最佳答案

据我所知,没有简单的方法可以使用 Delphi 附带的组件来传递表参数。 解决方法是使用临时表,该表可用于填充类型化表变量。

假设您的定义如下所示:

CREATE TYPE MyTableType AS TABLE 
( ID int
, Text varchar(100) )
GO

CREATE PROCEDURE P_Table 
    @Tab MyTableType READONLY
AS
BEGIN
    SET NOCOUNT ON;
    Select * from @Tab -- dummy operation just return the dataset
END
GO

您可以这样调用该过程:

var
  i: Integer;
begin
  // we create a temporary table since a table variable can obly be used for a single call
  DummyDataset.Connection.Execute('Create Table #mytemp(ID int,Text varchar(100))');
  DummyDataset.CommandText := 'Select * from #mytemp';
  DummyDataset.Open;
  for i := 0 to 10 do
  begin
    DummyDataset.Append;
    DummyDataset.Fields[0].Value := i;
    DummyDataset.Fields[1].Value := Format('A Text %d', [i]);
    DummyDataset.Post;
  end;
  MyDataset.CommandText := 'Declare @mytemp as MyTableType '
                         + 'Insert into @mytemp select * from #mytemp '  // copy data to typed table variable
                         + 'EXEC P_Table @Tab = @mytemp';
  MyDataset.Open;
  DummyDataset.Connection.Execute('Drop Table #mytemp');
end

关于sql - Delphi - 将表值参数传递给 SQL Server 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24180303/

相关文章:

sql-server - JTDS 和事务

sql - 替换 T-SQL 中的 Unicode 字符

delphi - 避免 Delphi 中的嵌套 try...finally block

multithreading - 主线程阻塞并行线程?

SQL Server - key 更新死锁

sql - 点和多边形之间的 STDistance 始终返回 0,即使它们相距数英里

mysql - 在 mysql 中嵌套 IF() 选择?

sql-server - 如果仅在 SQL Server 中的主文件组中创建所有分区,分区是否有益

delphi - 宿主组件创建的自定义子组件未由设计器自动命名

sql - 如何将 Oracle apex 项目限制为数字/字符值