如何在 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 语句的列列表中使用存储过程的结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 SELECT 中的列是不是可以为空?

如何在 Redshift 中的 select 语句中使用存储过程

如何在带有 Select 语句的存储过程上使用 LINQ?

存储过程禁止空参数

sqlserver 存储过程 保存在哪张表里如何通过select语句查询哪些存储过程是包含某个关键词

如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?