簡體   English   中英

使用sql存儲過程插入從存儲在表中的查詢返回的數據

[英]use sql stored procedure to insert data which is returned from a query stored in a table

sql server 2005我有一個存儲過程,我用它將數據插入表中。 某些數據需要來自執行存儲在單獨表中的查詢的結果。

我一直遇到的主要問題是無法正確執行返回的查詢。 我已經嘗試根據我讀過的其他帖子在過去幾天創建了幾個函數,但是我一直在用exec,execute,sp_executesql等命中sql錯誤。

我將粘貼幾個可用於復制環境的腳本。 我希望有人能夠提供一個實際的代碼示例,它將執行返回的查詢以便在存儲的proc插入函數中使用。

謝謝!!!

    CREATE TABLE [dbo].[CLIENT](
    [cli_id] [int] IDENTITY(1,1) NOT NULL,
    [cli_first_name] [varchar](100) NULL,

 CONSTRAINT [PK__CLIENT__07F6335A] PRIMARY KEY CLUSTERED 
(
    [cli_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO


INSERT INTO CLIENT (cli_first_name, cli_last_name) values ('tom', 'smith');
go



CREATE TABLE [dbo].[ASSESSMENT_DATALABEL_LIST](
    [adl_ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [BoundName] [nvarchar](50) NOT NULL,
    [Query] [ntext] NOT NULL,
    [KeyFieldName] [nvarchar](50) NOT NULL,
    [Status] [nvarchar](20) NOT NULL,
 CONSTRAINT [PK_ASSESSMENT_DATALABEL_LIST] PRIMARY KEY CLUSTERED 
(
    [adl_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

INSERT INTO ASSESSMENT_DATALABEL_LIST (Name, BoundName, Query, KeyFieldName, Status) 
values ('Name, First', 'cli_first_name', 'select IsNull(cli_first_name,'''') as cli_first_name FROM CLIENT WHERE cli_id = @KeyFieldValue', 'cli_ID', 'Active')
go

INSERT INTO ASSESSMENT_DATALABEL_LIST (Name, BoundName, Query, KeyFieldName, Status) 
values ('Name, Last', 'cli_last_name', 'select IsNull(cli_last_name,'''') as cli_last_name FROM CLIENT WHERE cli_id = @KeyFieldValue', 'cli_ID', 'Active')
go


CREATE TABLE [dbo].[Item_Source]
(   
    [Item_ID] [int] IDENTITY(1,1) NOT NULL,
    [ItemType] [nvarchar](50) NOT NULL,
    [ItemCaption] [nvarchar] (50) NULL,
      [adl_ID] [int] NOT NULL
)
go

INSERT INTO Item_Source
(ItemType, ItemCaption, adl_ID) values 
('DATALABEL', 'First Name',1)
go

INSERT INTO Item_Source
(ItemType, ItemCaption, adl_ID) values 
('DATALABEL', 'Last Name',2)
go

CREATE TABLE [dbo].[Item_Destination]
(
    [ItemType] [nvarchar](50) NOT NULL,
    [ItemCaption] [nvarchar] (50) NULL,
      [ItemValue] [nvarchar](50) NULL
)
go


CREATE PROCEDURE [dbo].[spInsertStuff]

@cli_id int

AS

INSERT INTO Item_Destination
(ItemType, ItemCaption, ItemValue)
SELECT
ItemType, ItemCaption, [[[ VALUE OF EXECUTED QUERY FROM ADL TABLE --- dbo.FunctionToGetResultsOfStoredQuery(Item_Source.adl_id, @cli_id) ]]]
FROM Item_Source WHERE Item_Source.Item_ID IN (1,2)

-- this insert will insert both Item_Source rows into Item_Dest with one call.  The first row should have an ItemValue of Tom, the second row should have an ItemValue of Smith
GO

你可以檢查這個小提琴

存儲過程的代碼是:

CREATE PROCEDURE [dbo].[spInsertStuff]

@cli_id int

AS


DECLARE @SQL AS VARCHAR(MAX)
DECLARE @ADL_ID AS INT

DECLARE MyCURSOR
CURSOR FOR 
SELECT QUERY, ADL_ID FROM ASSESSMENT_DATALABEL_LIST

OPEN MyCURSOR   
FETCH NEXT FROM MyCURSOR INTO @SQL, @ADL_ID   

WHILE @@FETCH_STATUS = 0   
BEGIN   

        SET @SQL = REPLACE(@SQL,'@KeyFieldValue',@cli_id)
        DECLARE @Temp AS TABLE ([Value] [nvarchar](50))

        INSERT INTO @Temp
        EXEC (@SQL)

        INSERT INTO Item_Destination
        (ItemType, ItemCaption, ItemValue)
        SELECT
        ItemType, ItemCaption, (SELECT [Value] FROM @Temp)
        FROM Item_Source 
        WHERE Item_Source.adl_ID = @ADL_ID   

        DELETE FROM @Temp

        FETCH NEXT FROM MyCURSOR INTO @SQL, @ADL_ID   
END   

CLOSE MyCURSOR   
DEALLOCATE MyCURSOR

GO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM