如何在 select 语句的列列表中使用存储过程的结果?
Posted
技术标签:
【中文标题】如何在 select 语句的列列表中使用存储过程的结果?【英文标题】:How can I use the results of a stored procedure in the column list in a select statement? 【发布时间】:2017-09-04 17:08:42 【问题描述】:如何让存储过程的结果出现在 select 语句的列列表中?我需要将新记录插入到具有奇怪密钥生成方案的数据库中,即存储过程的结果。
我正在尝试在 Sql Server 2012 中进行简单的插入选择查询,以实现类似的功能
Insert Into OldTable (
StrangelyDerivedKey, FirstName, LastName
)
Select (Exec dbo.GetKey()), FirstName, LastName FROM NewTable
通常我只会为“GetKey()”功能使用用户定义函数,但由于这是执行插入和更新的代码,Sql Server 不允许我在 UDF 中执行此操作。
如何让 Sql Server 接受存储过程的结果作为列?如果我想做一个字符串,那没问题。看起来这是一个语法怪癖,被另一个语法怪癖解决了,但我真的无法弄清楚这一点。
【问题讨论】:
你不能只接受 dbo.GetKey() 的结果到一个变量中,然后在你的 select 语句中使用这个变量吗? 啊——我的错误——你从“NewTable”中选择了一组行,并且需要为每一行生成一个新的键。 史蒂夫,你需要这样做多少次? NewTable 中有多少条记录?如果这是一次性练习,也许您可以将 NewTable 复制到表变量或临时表,为新 Id 添加一列,然后在循环中填充新 Id? 它需要每天运行 - 查询需要定期修改。dbo.GetKey()
是做什么的?或许我们可以帮助您重写它以根据表中的行数生成一组新键
【参考方案1】:
您可以直接在 SELECT 语句中使用该函数
INSERT INTO OldTable (StrangelyDerivedKey,
FirstName,
LastName)
SELECT dbo.GetKey(),
FirstName,
LastName
FROM NewTable;
但是,使用此选择,您将让表 newtable 中的所有 firstname 和 lastname 记录对于函数返回的奇怪派生键具有相同的值。您可能希望在 where 子句中有一些条件。
由于这只是一个示例查询,因此您可以这样做。
【讨论】:
【参考方案2】:这是基于 UDF 的东西,可能适合您。
CREATE FUNCTION dbo.udf_GetKey()
RETURNS @t TABLE (StrangelyDerivedKey varchar(20))
AS
BEGIN
-- Do whatever you want here to derive a value, this is just for testing
INSERT INTO @t VALUES ('fodinpwe8hpi9un')
RETURN
END
GO
-- INSERT INTO OldTable (StrangelyDerivedKey, FirstName, LastName)
SELECT B.StrangelyDerivedKey, A.FirstName, A.LastName
FROM NewTable A
CROSS APPLY
dbo.udf_GetKey() B
更改 UDF 以执行派生密钥所需的任何操作。向 UDF 添加参数以根据您传递的内容生成密钥。
【讨论】:
遗憾的是,UDF 不允许我插入。 这很有趣。我测试过这样的插入没有问题。以上是关于如何在 select 语句的列列表中使用存储过程的结果?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Redshift 中的 select 语句中使用存储过程