使用库存数据创建SQL Server存储过程

时间:2014-07-27 14:03:24

标签: sql sql-server variables procedure stock

我正在尝试将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;

谢谢!

:)

2 个答案:

答案 0 :(得分:0)

你有工作的SQL,这是一个艰难的部分。现在用

括起你的工作SQL
CREATE PROCEDURE <schema>.<Name>(
   @param   <type>
) as begin

end

你应该好好去。对于初学者,您可以使用dbo作为<schema>的值,直到您需要使用非默认架构。建议您不要使用前缀&#34; sp&#34;或&#34; xp&#34;对于您的过程名称,因为它们用于通过SQL Server识别系统和扩展过程。

如果您需要其他参数,可以使用逗号作为分隔符将它们添加到参数列表中。

答案 1 :(得分:0)

下面是从您的代码中收集的存储过程示例,它带有所需的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);