在SQL中,如何将VARCHAR转换为STRING?

时间:2011-06-24 01:18:22

标签: sql sql-server-2008-r2

我正在尝试使用参数对SQL Server 2008 R2执行BULK INSERT操作。但是,我遇到的问题是函数需要一个STRING,我将它传递给VARCHAR。我的SQL在下面。

DECLARE @filepath VARCHAR(30)
DECLARE @current_symbol VARCHAR(30)

DECLARE symbol_cursor CURSOR FOR
SELECT symbol FROM stocks.dbo.description WHERE 1=1

OPEN symbol_cursor;

FETCH NEXT FROM symbol_cursor INTO @current_symbol

WHILE @current_symbol is not null
BEGIN
SET @filepath = 'C:\Users\stkerr\Desktop\stockPricing\' + @current_symbol + '.prices'
BULK
INSERT stocks.dbo.pricing
FROM @filepath
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR=',',
    ROWTERMINATOR='\n',
    ORDER   ( [date], [open], high, low, [close],volume),
        ERRORFILE='C:\Users\stkerr\errors.txt'.
)

FETCH NEXT FROM symbol_cursor INTO @current_symbol
END 
GO

当我执行SET @filepath语句时,问题就出现了。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

为了将变量(@filepath)中的文件指定为BULK INSERT,您需要构造动态TSQL并执行它。

e.g。

DECLARE @str_command nvarchar(150)
SET @str_command = 'BULK INSERT [Customer_Sample] FROM ''' + @SourceFilePath + 
                   ''' WITH (formatfile = ''' + @FormatFilePath + 
                   ''', firstrow =' + cast(@RowNumber as nvarchar) + ')'
EXEC SP_EXECUTESQL @str_command

答案 1 :(得分:2)

sql中没有“string”类型。如果您在使用set语句时遇到问题,可能是因为您的最大长度为30个字符,并且您的文字长于此字段。

如果From @filepath给你带来麻烦,那是因为批量插入不会在from语句中带变量。

总的来说,我认为你的选择可能是通过动态sql执行批量插入。在变量中构建语句然后exec()它。

答案 2 :(得分:1)

我同意Mitch Wheat,动态SQL是要走的路。您还需要解决其他一些需要解决的问题。您的文件路径需要用引号括起来,我认为您的错误文件名后可能会有一个杂散点。尝试类似的事情;

DECLARE @filepath VARCHAR(30)
DECLARE @current_symbol VARCHAR(30)
DECLARE @sql VARCHAR(8000)

SET QUOTED_IDENTIFIER OFF

SET @current_symbol = (SELECT "tst") 

IF @current_symbol is not null
BEGIN
SET @filepath = "C:\Users\stkerr\Desktop\stockPricing\" + @current_symbol + ".prices"

SET @sql = "BULK INSERT stocks.dbo.pricing FROM '" + @filepath + "' WITH ( FIRSTROW = 2, FIELDTERMINATOR=',', ROWTERMINATOR='\n', ORDER   ( [date], [open], high, low, [close],volume), ERRORFILE='C:\Users\stkerr\Desktop\stockPricing\errors.txt') "
END 

PRINT @SQL -- Check out the result of this, and try and run it by itself.

EXEC (@SQL)
祝你好运。请注意,我的示例不适用于Mitch建议的动态SQL。让它先工作,然后用Mitch的例子重新实现。