【问题标题】:Create SQL Server stored procedure with stock data使用股票数据创建 SQL Server 存储过程
【发布时间】:2014-07-27 14:03:24
【问题描述】:

我正在尝试将我从 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-server variables procedure stock


    【解决方案1】:

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

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

    end
    

    你应该很高兴。对于初学者,您可以使用dbo 作为&lt;schema&gt; 的值,直到您需要使用非默认模式。建议您不要在过程名称中使用前缀“sp”或“xp”,因为它们用于标识 SQL Server 的系统和扩展过程。

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

    【讨论】:

      【解决方案2】:

      以下是从您的代码中收集的一个存储过程示例,该示例采用所需的符号参数。在这里,我使用了 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);
      

      【讨论】:

        猜你喜欢
        • 2016-09-24
        • 1970-01-01
        • 2019-09-13
        • 2013-05-02
        • 2012-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多