Sql server 使用SELECT执行存储过程

Sql server 使用SELECT执行存储过程,sql-server,select,insert,execute,Sql Server,Select,Insert,Execute,我试图从一个数据库中的一个表中提取数据,然后插入到另一个数据库中的一个表中 insert有一个预先编写的存储过程,它接受多个参数,我必须使用它,因为它还更新审计表 我现在有一个select语句,它返回正确的值,但我不确定现在如何将这些值传递给存储过程。我希望可以在存储过程execute命令中直接使用select语句,但这似乎是不可能的 有谁能建议我如何才能最好地实现上述目标 编辑-我当前的SQL是: DECLARE@client INT、@Fee_Earner INT、@RecordType-

我试图从一个数据库中的一个表中提取数据,然后插入到另一个数据库中的一个表中

insert有一个预先编写的存储过程,它接受多个参数,我必须使用它,因为它还更新审计表

我现在有一个select语句,它返回正确的值,但我不确定现在如何将这些值传递给存储过程。我希望可以在存储过程execute命令中直接使用select语句,但这似乎是不可能的

有谁能建议我如何才能最好地实现上述目标

编辑-我当前的SQL是:

DECLARE@client INT、@Fee_Earner INT、@RecordType-NVARCHAR(10)、@RecordDate-DATETIME、@Abstract-NVARCHAR(500)、@Comments-NVARCHAR(500)
挑选
@client=HC.client_UNO,
@Fee_Earner=HP.emp_UNO,
@记录类型='WILL',
@RecordDate=W.WILLDATE1,
@抽象=W.OTHERDOC1+''+W.OTHERDOC2+''+W.OTHERDOC3,
@注释=W注释
从…起
devpmsql.cmsnet_dev.dbo.HBM_客户端HC
右外部联接。WILLS W ON W.AN COLLATE DATABASE\u DEFAULT=HC.CLIENT\u CODE COLLATE DATABASE\u DEFAULT
左侧外部联接.HBM\u PERSNL HP ON HP.EMPLOYEE\u CODE COLLATE DATABASE\u DEFAULT=W.PARTNER COLLATE DATABASE\u DEFAULT
打印@客户端
打印@Fee_Earner
打印@RecordType
打印@RecordDate
打印@摘要

PRINT@Comments
如果要在远程服务器上执行过程,则可以使用以下语法调用过程

EXECUTE servername.dbname.owner.procedure_name
如果两个数据库位于同一服务器上,则使用以下命令调用过程

EXECUTE dbname.owner.procedure_name

您可以使用光标:

DECLARE @client INT, @Fee_Earner INT, @RecordType NVARCHAR(10), @RecordDate DATETIME, @Abstract NVARCHAR(500), @Comments NVARCHAR(500)


declare aCursor cursor for 
SELECT
HC.CLIENT_UNO,
HP.EMPL_UNO,
'WILL ',
W.WILLDATE1,
W.OTHERDOC1 + ' '  + W.OTHERDOC2 + ' ' + W.OTHERDOC3,
W.NOTES
FROM
devpmsql.cmsnet_dev.dbo.HBM_CLIENT HC
RIGHT OUTER JOIN <DBNAME>.WILLS W ON W.AN COLLATE DATABASE_DEFAULT = HC.CLIENT_CODE COLLATE DATABASE_DEFAULT
LEFT OUTER JOIN <DBNAME>.HBM_PERSNL HP ON HP.EMPLOYEE_CODE COLLATE DATABASE_DEFAULT = W.PARTNER COLLATE DATABASE_DEFAULT

open aCursor
fetch NEXT from aCursor into 
@client,
@Fee_Earner,
@RecordType,
@RecordDate,
@Abstract,
@Comments

while @@FETCH_STATUS = 0
begin

    exec yourSP @client,
        @Fee_Earner,
        @RecordType,
        @RecordDate,
        @Abstract,
        @Comments

    fetch NEXT from aCursor into 
    @client,
    @Fee_Earner,
    @RecordType,
    @RecordDate,
    @Abstract,
    @Comments

end
DECLARE@client INT、@Fee_Earner INT、@RecordType-NVARCHAR(10)、@RecordDate-DATETIME、@Abstract-NVARCHAR(500)、@Comments-NVARCHAR(500)
为声明aCursor游标
挑选
HC.CLIENT_UNO,
HP.Emp_UNO,
“威尔”,
W.WILLDATE1,
W.OTHERDOC1+“”+W.OTHERDOC2+“”+W.OTHERDOC3,
W.NOTES
从…起
devpmsql.cmsnet_dev.dbo.HBM_客户端HC
右外部联接。WILLS W ON W.AN COLLATE DATABASE\u DEFAULT=HC.CLIENT\u CODE COLLATE DATABASE\u DEFAULT
左侧外部联接.HBM\u PERSNL HP ON HP.EMPLOYEE\u CODE COLLATE DATABASE\u DEFAULT=W.PARTNER COLLATE DATABASE\u DEFAULT
开放式aCursor
从aCursor取下一个到
@客户,
@收费者,
@记录类型,
@记录日期,
@摘要,,
@评论
而@@FETCH\u STATUS=0
开始
exec yourSP@client,
@收费者,
@记录类型,
@记录日期,
@摘要,,
@评论
从aCursor取下一个到
@客户,
@收费者,
@记录类型,
@记录日期,
@摘要,,
@评论
结束
您可以使用以下选项:

SELECT  * FROM OPENROWSET ('SQLOLEDB','Server=(local);TRUSTED_CONNECTION=YES;','set fmtonly off exec master.dbo.sp_who')

用存储过程替换
master.dbo.sp_who

要回答您的问题,如果您必须循环查看结果,则可以使用:

那么您的程序将类似于:

CREATE PROCEDURE dbo.InsertValues @NewValues dbo.YourTypeName READONLY
AS
BEGIN
    INSERT dbo.YourTable (Client, Fee_Earner, RecordType, RecordDate, Abstract, Comments)
    OUTPUT inserted.Client, #'Created', GETDATE() INTO dbo.YourAuditTable (Client, EventName, CreatedDate)
    SELECT Client, Fee_Earner, RecordType, RecordDate, Abstract, Comments
    FROM NewValues;

END
DECLARE @T dbo.YourTypeName;
INSERT @T (Client, Fee_Earner, RecordType, RecordDate, Abstract, Comments)
SELECT  HC.CLIENT_UNO, 
        HP.EMPL_UNO, 
        RecordType = 'WILL',
        W.WILLDATE1,
        Abstract = W.OTHERDOC1 + ' '  + W.OTHERDOC2 + ' ' + W.OTHERDOC3,
        W.NOTES
FROM    devpmsql.cmsnet_dev.dbo.HBM_CLIENT HC
        RIGHT OUTER JOIN <DBNAME>.WILLS W 
            ON W.AN COLLATE DATABASE_DEFAULT = HC.CLIENT_CODE COLLATE DATABASE_DEFAULT
        LEFT OUTER JOIN <DBNAME>.HBM_PERSNL HP 
            ON HP.EMPLOYEE_CODE COLLATE DATABASE_DEFAULT = W.PARTNER COLLATE DATABASE_DEFAULT;


EXECUTE dbo.InsertValues @T;
因为您提到了审计表,所以我包含了审计表,这通常是访问已插入数据的最佳方式

最后,调用您的过程时,您将使用以下命令:

CREATE PROCEDURE dbo.InsertValues @NewValues dbo.YourTypeName READONLY
AS
BEGIN
    INSERT dbo.YourTable (Client, Fee_Earner, RecordType, RecordDate, Abstract, Comments)
    OUTPUT inserted.Client, #'Created', GETDATE() INTO dbo.YourAuditTable (Client, EventName, CreatedDate)
    SELECT Client, Fee_Earner, RecordType, RecordDate, Abstract, Comments
    FROM NewValues;

END
DECLARE @T dbo.YourTypeName;
INSERT @T (Client, Fee_Earner, RecordType, RecordDate, Abstract, Comments)
SELECT  HC.CLIENT_UNO, 
        HP.EMPL_UNO, 
        RecordType = 'WILL',
        W.WILLDATE1,
        Abstract = W.OTHERDOC1 + ' '  + W.OTHERDOC2 + ' ' + W.OTHERDOC3,
        W.NOTES
FROM    devpmsql.cmsnet_dev.dbo.HBM_CLIENT HC
        RIGHT OUTER JOIN <DBNAME>.WILLS W 
            ON W.AN COLLATE DATABASE_DEFAULT = HC.CLIENT_CODE COLLATE DATABASE_DEFAULT
        LEFT OUTER JOIN <DBNAME>.HBM_PERSNL HP 
            ON HP.EMPLOYEE_CODE COLLATE DATABASE_DEFAULT = W.PARTNER COLLATE DATABASE_DEFAULT;


EXECUTE dbo.InsertValues @T;
声明@T dbo.YourTypeName;
插入@T(客户、收费者、记录类型、记录日期、摘要、评论)
选择HC.CLIENT\u UNO,
HP.Emp_UNO,
记录类型='WILL',
W.WILLDATE1,
抽象=W.OTHERDOC1+''+W.OTHERDOC2+''+W.OTHERDOC3,
W.NOTES
来自devpmsql.cmsnet_dev.dbo.HBM_客户端HC
右外连接
在W.AN COLLATE DATABASE\u DEFAULT=HC.CLIENT\u CODE COLLATE DATABASE\u DEFAULT上
左外连接。HBM_PERSNL HP
在HP.EMPLOYEE\u CODE COLLATE DATABASE\u DEFAULT=W.PARTNER COLLATE DATABASE\u DEFAULT;
执行dbo.InsertValues@T;

当我需要使用不同的参数值执行过程时,我会使用此选项:从[dbo].[ProcedureName]@Param1='+CAST([ID]AS VARCHAR(30))+',@Param2=''+[Name]+''从[dbo].[TestTable]选择。看看是否可以根据需要进行修改。其思想是生成EXEC过程语句。您通常会构建一个查询,该查询将首先执行
SELECT
语句,然后将结果存储在参数中。然后可以将这些参数传递给存储过程。很可能您编写的查询本身就是一个存储过程,带有
SELECT
的输入参数。我们需要有关senario的更多信息,无论如何,您可以使用类似下面的内容insert into tablename WHERE columnname IN(SELECT columnname FROM table2 WHERE condition)SchmitzIT,谢谢。我正在存储select in变量的结果,但是您能告诉我现在如何循环上面的SQL,以便将每一行插入到存储的过程中吗?我假设我将调用当前打印语句所在的存储过程,但不确定如何遍历所有行。Arun,谢谢,但我必须使用预定义的存储过程-我不能使用直接插入。Vishal,谢谢-我没有试过,因为ShmitzIT的解决方案对我的情况来说似乎有点整洁。