如何创建接收表名作为输入、返回GUID列表的数据库函数(无法使用动态SQL)
如何创建接收表名作为输入、返回GUID列表的数据库函数(无法使用动态SQL)
我太懂你这种卡住的感觉了——想做个能根据输入表名返回对应GUID列表的函数,结果因为不能用动态SQL,连语法检查都过不了,属实头疼。
其实不用动态SQL的话,咱们只能换个思路:预先把所有需要支持的表都枚举出来,用条件分支来处理。毕竟数据库函数(不管是表值还是标量函数)大多不允许动态执行SQL,这是语法和安全限制决定的。
拿SQL Server举个具体例子(毕竟你提到了GUID,大概率是用这个):
首先,咱们得先定义一个用来返回结果的表类型,毕竟要返回的是GUID列表:
CREATE TYPE GuidList AS TABLE (Id UNIQUEIDENTIFIER);
接下来创建表值函数,把需要支持的表一个个写进条件分支里:
CREATE FUNCTION dbo.GetGuidsFromTable(@TableName NVARCHAR(128)) RETURNS @Result GuidList AS BEGIN -- 这里可以根据实际需要添加更多表的判断分支 IF UPPER(@TableName) = 'TABLEA' INSERT INTO @Result SELECT Id FROM TableA; -- 假设表的GUID列叫Id,你可以改成实际列名 ELSE IF UPPER(@TableName) = 'TABLEB' INSERT INTO @Result SELECT Id FROM TableB; ELSE IF UPPER(@TableName) = 'TABLEC' INSERT INTO @Result SELECT Id FROM TableC; -- 如果输入的表名不在支持列表里,就返回空结果 RETURN; END;
几个小提醒:
- 我用了
UPPER()来统一表名的大小写,避免因为数据库的大小写敏感设置导致匹配失败,你也可以根据自己的情况调整。 - 要是以后有新表需要支持,直接给函数加新的
ELSE IF分支就行。 - 记得把例子里的
Id换成你实际表中GUID列的名称,别直接抄哦。
这种方法虽然没办法支持任意表,但这是不用动态SQL的唯一可行方案——毕竟数据库函数的语法规则就是这么限制的,只能妥协一下预先枚举需要处理的表啦。
备注:内容来源于stack exchange,提问作者ff8mania
相关产品推荐
相关产品推荐

