【问题标题】:Dynamic SQL to pass table name and return Max ID value动态 SQL 传递表名并返回 Max ID 值
【发布时间】:2013-06-15 00:21:04
【问题描述】:

这是我正在尝试做的我有一个表列表(其中 50 个),在所有表中我有一个名为“ID”的公共列,我想要做的是传递将动态返回我的表名最大(ID)值。我需要 MAX(ID) 值,因为我将把这个值用于其他东西。

所以我正在考虑创建一个函数,我将在其中传递表名,它会返回 MAX(ID) 值,然后我可以在其他选择语句中使用该函数。但这里的问题是 SQL 函数不支持动态 SQL

关于我还有什么其他选项的任何建议,请记住我需要 SQL 中的 max(id) 值。

【问题讨论】:

  • 为什么不能使用存储过程?

标签: sql sql-server tsql dynamic-sql


【解决方案1】:
create function [dbo].[LastIdOf](@TableName varchar(50)) returns int
as
begin
   declare @LastId int;
   select @LastId = convert(int, i.last_value) from sys.tables t inner join sys.identity_columns i on t.object_id = i.object_id where t.name = @TableName;
   return @LastId;
end

【讨论】:

  • 基于身份列 tnx 的有趣解决方案。在这种情况下,也可以使用函数
  • 最大值不是最后一个值,当有人在 IDENTITY_INSERT OFF 的情况下插入会发生什么?
  • Identity_insert off 通常在有人进行批量加载时使用。开发人员必须考虑是否会在批量加载表的同时使用此功能。
【解决方案2】:

你为什么不创建一个视图并在其上做一个 MAX(ID)?

【讨论】:

  • 视图不能接受参数。我正在考虑创建一个动态 SP ,并将表名传递给该 SP ,将 SP 的值存储在 #temp 表中,然后在我的其他 SQL 语句中使用该值。
【解决方案3】:
create proc procTableMaxID (@Tablename varchar(100)
as
DECLARE @SQL AS nvarchar(500)

SET @SQL = 'SELECT Max(ID) from ' + @Tablename


EXECUTE sp_executesql @SQL

Procs 不提供用作表格或在 select 语句中使用的灵活性,但有一些方法可以解决这个问题。

【讨论】:

  • Jeff,感谢您的反馈,但我需要使用 SP 中的值或 SQL 中的函数。根据您的 SP,我可以将值返回我的 SP 存储在临时表中,我可以在我的 SELECT 语句中使用该临时表。
【解决方案4】:

试试这样的:

select *
from TABLE A
where id = (
  select max(id)
  from TABLE
  where Table.key = A.Table.key
);

【讨论】:

  • 如果它是一个日期字段,那么你将不得不像 date
【解决方案5】:
select 
'select max('+z.COLUMN_NAME +')' +' from '+z.TABLE_NAME  from (
SELECT u.TABLE_NAME,u.COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE u
left join INFORMATION_SCHEMA.TABLES t on u.TABLE_NAME = t.TABLE_NAME
WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1
AND u.TABLE_NAME = t.TABLE_NAME) as z

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多