簡體   English   中英

使用庫存數據創建SQL Server存儲過程

[英]Create SQL Server stored procedure with stock data

我試圖將我從SQL Server獲得的一些代碼轉換為具有可以傳遞的參數的存儲過程,但是我不確定如何執行此操作。 我希望URL的4個字母的股票符號是一個變量,以便我可以傳遞不同的符號,我還需要將此代碼用作存儲過程。

GOOG是我需要變量的地方。

http://finance.yahoo.com/webservice/v1/symbols/GOOG/quote '

--RSS FEED
DECLARE @docHandle   INT;
DECLARE @xmlData     XML;
DECLARE @URL         NVARCHAR(255);
DECLARE @file        NVARCHAR(255);
DECLARE @cmd         NVARCHAR(255);
DECLARE @sql         NVARCHAR(255);
DECLARE @tXML        TABLE(data XML);

SET @URL  = 'http://finance.yahoo.com/webservice/v1/symbols/GLUU/quote';
SET @file = 'c:\temp\quotes.xml';

-- Downloading the data
SET @cmd = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell (new-object System.Net.WebClient).DownloadFile( ''' + @URL + ''',''' + @file + '''  )'
EXEC master.dbo.xp_cmdshell @cmd, no_output

-- Loading the Downloaded File into the XML variable
SET @sql = 'SELECT BulkColumn FROM OPENROWSET( BULK ''' + @file + ''', SINGLE_BLOB ) AS a'
INSERT @tXML EXEC(@sql);
SELECT @xmlData = data from @tXML 

-- Preparing the Relational Table from the XML variable
EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlData;

INSERT INTO tblstockdata ([Name], [Price], [Symbol], [TS], [Type], [Volume])
SELECT * FROM OPENXML(@docHandle, N'//list/resources/resource')  
  WITH ( Name    VARCHAR(10) 'field[@name="name"]',
         Price   VARCHAR(10) 'field[@name="price"]',
         Symbol  VARCHAR(10) 'field[@name="symbol"]',
         TS      VARCHAR(10) 'field[@name="ts"]',
         Type    VARCHAR(10) 'field[@name="type"]',
         Volume  VARCHAR(10) 'field[@name="volume"]');

EXEC sp_xml_removedocument @docHandle;

謝謝!

:)

您擁有有效的SQL,這是困難的部分。 現在將您的工作SQL與

CREATE PROCEDURE <schema>.<Name>(
   @param   <type>
) as begin

end

而且你應該很好走。 對於初學者,可以將dbo用作<schema>的值,直到需要使用非默認架構為止。 建議不要為過程名稱使用前綴“ sp”或“ xp”,因為這些名稱用於識別SQL Server的系統過程和擴展過程。

如果需要其他參數,可以使用逗號將它們添加到參數列表中。

下面是從您的代碼中收集的存儲過程示例,該示例采用了所需的symbol參數。 在這里,我使用XML數據類型方法而不是sp_xml_preparedocument。 如果多個用戶可能同時調用此存儲過程,建議您為該文件生成一個唯一名稱,然后再刪除。 您可能會考慮使用CLR存儲過程來避免臨時文件和OPENROWSET丑陋。

CREATE PROC dbo.usp_GetEquityQuote
    @symbol varchar(10)
AS

DECLARE @URL         NVARCHAR(255);
DECLARE @file        NVARCHAR(255);
DECLARE @cmd         NVARCHAR(255);
DECLARE @sql         NVARCHAR(255);
DECLARE @tXML        TABLE(data XML);

SET @URL  = 'http://finance.yahoo.com/webservice/v1/symbols/' + @symbol + '/quote';
SET @file = 'c:\temp\quotes.xml';

-- Downloading the data
SET @cmd = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell (new-object System.Net.WebClient).DownloadFile( ''' + @URL + ''',''' + @file + '''  )';
EXEC master.dbo.xp_cmdshell @cmd, no_output;

-- Loading the Downloaded File into the XML variable
SET @sql = 'SELECT BulkColumn FROM OPENROWSET( BULK ''' + @file + ''', SINGLE_BLOB ) AS a';
INSERT @tXML EXEC(@sql);
    SELECT data from @tXML ;

SELECT
     resources.resource.value('field[@name="name"][1]', 'varchar(10)') AS name
     ,resources.resource.value('field[@name="price"][1]', 'decimal(18,4)') AS price
     ,resources.resource.value('field[@name="symbol"][1]', 'varchar(10)') AS symbol
     ,resources.resource.value('field[@name="ts"][1]', 'bigint') AS ts
     ,resources.resource.value('field[@name="type"][1]', 'varchar(10)') AS type
     ,resources.resource.value('field[@name="volume"][1]', 'bigint') AS volume
FROM (SELECT data FROM @tXML) AS tXML(data)
CROSS APPLY data.nodes('/list/resources/resource') AS resources(resource);

暫無
暫無

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

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