我正在尝试将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;
谢谢!
:)
答案 0 :(得分:0)
你有工作的SQL,这是一个艰难的部分。现在用
括起你的工作SQLCREATE 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);