Sql server 使用SELECT执行存储过程
我试图从一个数据库中的一个表中提取数据,然后插入到另一个数据库中的一个表中 insert有一个预先编写的存储过程,它接受多个参数,我必须使用它,因为它还更新审计表 我现在有一个select语句,它返回正确的值,但我不确定现在如何将这些值传递给存储过程。我希望可以在存储过程execute命令中直接使用select语句,但这似乎是不可能的 有谁能建议我如何才能最好地实现上述目标 编辑-我当前的SQL是: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-
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的解决方案对我的情况来说似乎有点整洁。