只是一个快速的问题。我有一个存储过程,它接受两个参数,一个 varchar(表名)和一个 tabletype(主键 ID 值的范围),并使用它们返回所有 FK 连接到表的所有 FK 连接以获取提供的 ID。
虽然使用起来很棘手,因为您实际上需要声明表类型,选择 ID,然后执行如下过程:
DECLARE @IDVALS SearchObjRef_Type
INSERT INTO @IDVALS
SELECT TOP 10 RAND_ID FROM RANDTABLE
EXEC usp_SearchObjRef @TABLENAME = 'RANDTABLE', @IDRANGE = @IDVALS
这工作得很好,但我想找到一种更舒适、更快速、更简单的方法来在标准选择中使用该过程。假设甚至可以在一个命令中完成所有这些,那么最好的方法是什么?
对于一个显然不起作用的逻辑示例,我想做的是以下形式:
EXEC usp_SearchObjRef @TABLENAME = 'RANDTABLE',
@IDRANGE = (SELECT TOP 10 RAND_ID FROM RANDTABLE)
你这样做的方式是最快、最简单和最舒适的方式,你会发现将 TVP 传递给存储过程,抱歉。您不能将表达式传递给存储过程参数,即使是简单的事情,例如:
失败:
为了使用表达式,它需要是:
如果输出是一个始终具有相同列的单个结果集(例如
TableName, RowCount
),您可以编写一个表值 CLR 函数并将查询字符串作为参数。在纯 T-SQL 中没有真正干净的方法可以做到这一点。