【问题标题】:CTE and tablename as parameterCTE 和表名作为参数
【发布时间】:2013-01-12 03:50:10
【问题描述】:

在 SQL Server 2008 中,我有一个包含 CTE 的存储过程

;with t1 as (select * from db..tablename where …)
Select * from t1;

我想使用tablename 作为存储过程参数之一。

请注意T1 的大小太大而无法使用类似的东西

Exec(‘select * into #temptable from db..’+’tablename’+’ where …’)

有类似的问题和答案,但似乎都没有帮助。

谢谢

【问题讨论】:

  • 你能详细解释一下吗? “请注意 T1 的大小太大,无法使用类似 Exec('select * into #temptable from db..'+'tablename'+' where ...')”之类的东西”
  • 为什么他们似乎没有帮助?将表名作为参数传入。检查它是否作为表名,最好是应该使用的表名,然后使用表名而不是参数构建一些sql并执行它。这很痛苦,因为你应该非常努力地不要这样做......
  • 第一个子查询 T1 的数据集非常大。如果不是这种情况,那么我会将 t1 的输出发送到临时表中。
  • 有人对这个问题投了反对票,觉得不需要解释。它只是告诉我他/她是什么人。

标签: sql-server-2008 tsql stored-procedures common-table-expression


【解决方案1】:

我喜欢使用 CTE。它们是一个很棒的实用工具!

对于这个特殊的问题,我可能会建议反对它。鉴于您正在将一个表的数据“传输”到另一个存储过程,我认为您应该以不同的方式处理它。

考虑你的第一个过程:

IF OBJECT_ID('SomeTempTable') IS NOT NULL DROP SomeTempTable;

SELECT
    *
INTO SomeTempTable
FROM
YourOtherTable

EXEC YourSecondProcedureName

请注意,您需要注意表的范围。在您考虑之前,我没有包含工作代码。更多信息可以在这里找到:Temp Table Scope

另请注意,“YourSecondProcedureName”现在不采用表值。相反(并且在正确的范围内),您只需按名称调用您的临时表。它也被认为是完成后删除临时表的最佳实践,尽管 sql server 中有一些机制取决于版本可以为你做一些。再次作用域作用域。

希望这会有所帮助!

马特

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2012-05-29
    • 2022-01-16
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多