Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中,如何将VARCHAR转换为字符串?_Sql_Sql Server 2008 R2 - Fatal编程技术网

在SQL中,如何将VARCHAR转换为字符串?

在SQL中,如何将VARCHAR转换为字符串?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我正在尝试使用参数在SQL Server 2008 R2上执行大容量插入操作。但是,我遇到了这样的问题:函数需要一个字符串,而我要传递一个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

我正在尝试使用参数在SQL Server 2008 R2上执行大容量插入操作。但是,我遇到了这样的问题:函数需要一个字符串,而我要传递一个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语句时出现的


有什么想法吗?

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

e、 g

sql中没有“字符串”类型。如果您在使用
set
语句时遇到问题,很可能是因为您给了它最大长度30个字符,而您的文本比这个长度长

如果是@filepath中的
给您带来了麻烦,那是因为大容量插入不会在
From
语句中使用变量


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

我同意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的例子重新实现

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)