如何在select语句的列列表中使用存储过程的结果?

时间:2017-09-04 17:08:42

标签: sql sql-server stored-procedures user-defined-functions

如何将存储过程的结果放在select语句的列列表中?我需要将新记录插入到具有奇数密钥生成方案的数据库中,即由存储​​过程产生的方案。

我正在尝试在Sql Server 2012中执行一个简单的插入选择查询,就像这样

Insert Into OldTable (
StrangelyDerivedKey, FirstName, LastName
)
Select (Exec dbo.GetKey()), FirstName, LastName FROM NewTable

通常我会使用用户定义函数来实现“GetKey()”功能,但由于这是执行插入和更新的代码,因此Sql Server不允许我在UDF中执行此操作。

如何让Sql Server接受存储过程的结果作为列?如果我想做一个字符串,那就没问题了。看起来这是一个语法怪癖,可以通过另一个句法怪癖来解决,但我似乎无法想象这一点。

谢谢大家!

2 个答案:

答案 0 :(得分:0)

这是基于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以根据您传递的内容生成密钥。

希望这有帮助。

答案 1 :(得分:0)

您可以直接在SELECT语句中使用该函数

INSERT INTO OldTable (StrangelyDerivedKey, 
                      FirstName, 
                      LastName)
SELECT dbo.GetKey(),
       FirstName, 
       LastName 
  FROM NewTable;

但是,使用此选项,您将使表newtable中的所有firstname和lastname记录与该函数返回的strangelyderivedkey具有相同的值。您可能希望在where子句中有一些条件。

由于这只是一个示例查询,因此您可以这样做。