存储过程 - 将数据类型 varchar 转换为 float 时出错
Stored Procedure - Error converting data type varchar to float
我正在尝试将一个 table 的浮点值插入另一个 table,但在 post 的主题行中收到错误消息:
将数据类型 varchar 转换为 float 时出错。
两个 table 中的两个字段都设置为浮动。值是邮政编码的纬度和经度。 latitude/longitude 的一个例子是:
45.895698
-72.365896
这是我的一些代码片段:
declare @v_latitude float
declare @v_longitude float
-- Grab Latitude & Longitude --
if @v_zip_code IS NOT NULL
SELECT @v_latitude=z_latitude, @v_longitude=z_longitude FROM tbl_ZipCodes WHERE z_zip_code = @v_zip_code
set @strValues = @strValues + '''' + @v_city + ''', ''' + @v_state + ''', ''' + @v_zip_code + ''', ''' + @v_daytime_phone + ''', ''' + @v_contact_name + ''', '''
+ @v_email_address + ''', ' + cast(@u_id as varchar) + ', ' + cast(@d_id as varchar) + ', 1, ''' + cast(CURRENT_TIMESTAMP as varchar) + ''', 1 , ''' + cast(@v_latitude as float) + ''', ''' + cast(@v_longitude as float) + ''', '''
+ cast(CURRENT_TIMESTAMP as varchar) + ''', dft.df_t_id, (SELECT CASE WHEN dft.df_t_v_price <> 0 THEN dft.df_t_v_price WHEN dft.df_t_v_internet_price <> 0 THEN dft.df_t_v_internet_price WHEN dft.df_t_v_other_price <> 0 THEN dft.df_t_v_other_price ELSE 0 END AS v_search_price)'
使用@v_latitude 和@v_longitude 变量的代码部分在这里:
... , ''' + cast(@v_latitude as float) + ''', ''' + cast(@v_longitude as float) + ''', ...
忽略“...”,因为我正在演示这些值周围还有其他代码。
如有任何帮助,我们将不胜感激!
编辑:这是我正在使用的附加代码:
-- Check For User Profile --
SELECT @counter = COUNT(*) FROM tbl_Customers WHERE u_id = @u_id
if @counter > 0
SELECT @v_city=c_city, @v_state =c_state, @v_zip_code=c_zip_code,@v_daytime_phone =c_phone_number FROM tbl_Customers WHERE u_id = @u_id
else
SELECT @v_city=d_city, @v_state =d_state, @v_zip_code=d_zip_code,@v_daytime_phone =d_phone_number FROM tbl_Dealers WHERE d_id = @d_id
-- Grab Contact Information --
SELECT @v_contact_name = u_name, @v_email_address = u_email_address FROM tbl_Users WHERE u_id = @u_id
-- Grab Latitude & Longitude --
if @v_zip_code IS NOT NULL
SELECT @v_latitude=z_latitude, @v_longitude=z_longitude FROM tbl_ZipCodes WHERE z_zip_code = @v_zip_code
-- Add Additional Fields --
set @strFields = @strFields + 'v_city, v_state, v_zip_code, v_daytime_phone, v_contact_name, v_email_address, u_id, d_id, v_processed, v_processed_date, v_active, ,v_latitude, v_longitude, v_last_activity, v_dealerfeed, v_search_price'
set @strJoin = @strJoin + ' LEFT JOIN tbl_Vehicles v ON v.v_stock_number = dft.df_t_v_stock_number'
set @strValues = @strValues + '''' + @v_city + ''', ''' + @v_state + ''', ''' + @v_zip_code + ''', ''' + @v_daytime_phone + ''', ''' + @v_contact_name + ''', '''
+ @v_email_address + ''', ' + cast(@u_id as varchar) + ', ' + cast(@d_id as varchar) + ', 1, ''' + cast(CURRENT_TIMESTAMP as varchar) + ''', 1 , ''' + @v_latitude + ''', ''' + @v_longitude + ''', '''
+ cast(CURRENT_TIMESTAMP as varchar) + ''', dft.df_t_id, (SELECT CASE WHEN dft.df_t_v_price <> 0 THEN dft.df_t_v_price WHEN dft.df_t_v_internet_price <> 0 THEN dft.df_t_v_internet_price WHEN dft.df_t_v_other_price <> 0 THEN dft.df_t_v_other_price ELSE 0 END AS v_search_price)'
-- Insert Records Into Vehicle Table (but not twice!) --
set @strSQL = 'INSERT INTO tbl_Vehicles (' + @strFields + ') SELECT ' + @strValues + ' FROM tbl_DealerFeed_temp dft ' + @strJoin + ' WHERE dft.df_t_processed = 0 AND dft.df_d_id = ' + cast(@df_d_id as varchar)
set @strSQL = @strSQL + ' AND dft.df_t_v_stock_number NOT IN ( SELECT v.v_stock_number FROM tbl_Vehicles v WHERE v.d_id = ' + cast(@d_id as varchar) + ')'
print @strSQL
EXEC (@strSQL)
你可以试试
''' + cast( @v_latitude as varchar(20))
+ ''', ''' + cast((@v_longitude as varchar(20))+ '''
在执行动态 SQL 时,您将所有内容都强制转换为字符串类型。
但是单引号让您感到困惑。如果您要插入的列是浮点数,则您不希望插入的浮点值用引号引起来。
我还发现 CONVERT
比 CAST
更灵活(主要是日期)(我只为多样性做了 CONVERT):
所以你想去掉那些三重引号:
...+ CONVERT(varchar(20), @v_latitude) +',' + CONVERT(varchar(20), @v_longitude) +...
编辑添加:您的固定代码应如下所示:
set @strValues = @strValues + '''' + @v_city + ''', ''' + @v_state + ''', ''' + @v_zip_code + ''', ''' + @v_daytime_phone + ''', ''' + @v_contact_name + ''', '''
+ @v_email_address + ''', ' + cast(@u_id as varchar) + ', ' + cast(@d_id as varchar) + ', 1, ''' + cast(CURRENT_TIMESTAMP as varchar) + ''', 1 , ' + Convert(varchar(20), @v_latitude) + ', ' + Convert(varchar(20), @v_longitude) + ', '''
+ cast(CURRENT_TIMESTAMP as varchar) + ''', dft.df_t_id, (SELECT CASE WHEN dft.df_t_v_price <> 0 THEN dft.df_t_v_price WHEN dft.df_t_v_internet_price <> 0 THEN dft.df_t_v_internet_price WHEN dft.df_t_v_other_price <> 0 THEN dft.df_t_v_other_price ELSE 0 END AS v_search_price)'
执行你的 SQL 没有 EXEC (@strSQL)
并查看打印的 SQL
再次编辑;修复您的 Float 被限制为四舍五入到小数点后 4 位(这是因为它是 Float)但是您可以通过先将其转换为小数或使用 STR
来绕过它,这将帮助您理解发生了什么:
declare @v_latitude float = -45.12345678
print @v_latitude
print 'Cast = '+ cast( @v_latitude as varchar)
print 'Convert = '+ convert(varchar(20), @v_latitude)
print 'Cast via decimal = '+ cast( cast(@v_latitude as decimal(18,9)) as varchar)
print 'Convert via decimal = '+ convert( varchar(20), convert(decimal(18,9), @v_latitude))
print 'str = '+ str(@v_latitude,18,9)
==
-45.1235
Cast = -45.1235
Convert = -45.1235
Cast via decimal = -45.123456780
Convert via decimal = -45.123456780
str = -45.123456780
问题可能是您的动态 sql 在浮点数两边加上了单引号。
尝试更改
, ''' + cast(@v_latitude as float) + ''', ''' + cast(@v_longitude as float) + ''', ..
进入
, ' + STR(@v_latitude,<length>,<decimals>) + ', ' + STR(@v_longitude,<length>,<decimals>) + ', ..
参考STR ()
我正在尝试将一个 table 的浮点值插入另一个 table,但在 post 的主题行中收到错误消息:
将数据类型 varchar 转换为 float 时出错。
两个 table 中的两个字段都设置为浮动。值是邮政编码的纬度和经度。 latitude/longitude 的一个例子是:
45.895698 -72.365896
这是我的一些代码片段:
declare @v_latitude float
declare @v_longitude float
-- Grab Latitude & Longitude --
if @v_zip_code IS NOT NULL
SELECT @v_latitude=z_latitude, @v_longitude=z_longitude FROM tbl_ZipCodes WHERE z_zip_code = @v_zip_code
set @strValues = @strValues + '''' + @v_city + ''', ''' + @v_state + ''', ''' + @v_zip_code + ''', ''' + @v_daytime_phone + ''', ''' + @v_contact_name + ''', '''
+ @v_email_address + ''', ' + cast(@u_id as varchar) + ', ' + cast(@d_id as varchar) + ', 1, ''' + cast(CURRENT_TIMESTAMP as varchar) + ''', 1 , ''' + cast(@v_latitude as float) + ''', ''' + cast(@v_longitude as float) + ''', '''
+ cast(CURRENT_TIMESTAMP as varchar) + ''', dft.df_t_id, (SELECT CASE WHEN dft.df_t_v_price <> 0 THEN dft.df_t_v_price WHEN dft.df_t_v_internet_price <> 0 THEN dft.df_t_v_internet_price WHEN dft.df_t_v_other_price <> 0 THEN dft.df_t_v_other_price ELSE 0 END AS v_search_price)'
使用@v_latitude 和@v_longitude 变量的代码部分在这里:
... , ''' + cast(@v_latitude as float) + ''', ''' + cast(@v_longitude as float) + ''', ...
忽略“...”,因为我正在演示这些值周围还有其他代码。
如有任何帮助,我们将不胜感激!
编辑:这是我正在使用的附加代码:
-- Check For User Profile --
SELECT @counter = COUNT(*) FROM tbl_Customers WHERE u_id = @u_id
if @counter > 0
SELECT @v_city=c_city, @v_state =c_state, @v_zip_code=c_zip_code,@v_daytime_phone =c_phone_number FROM tbl_Customers WHERE u_id = @u_id
else
SELECT @v_city=d_city, @v_state =d_state, @v_zip_code=d_zip_code,@v_daytime_phone =d_phone_number FROM tbl_Dealers WHERE d_id = @d_id
-- Grab Contact Information --
SELECT @v_contact_name = u_name, @v_email_address = u_email_address FROM tbl_Users WHERE u_id = @u_id
-- Grab Latitude & Longitude --
if @v_zip_code IS NOT NULL
SELECT @v_latitude=z_latitude, @v_longitude=z_longitude FROM tbl_ZipCodes WHERE z_zip_code = @v_zip_code
-- Add Additional Fields --
set @strFields = @strFields + 'v_city, v_state, v_zip_code, v_daytime_phone, v_contact_name, v_email_address, u_id, d_id, v_processed, v_processed_date, v_active, ,v_latitude, v_longitude, v_last_activity, v_dealerfeed, v_search_price'
set @strJoin = @strJoin + ' LEFT JOIN tbl_Vehicles v ON v.v_stock_number = dft.df_t_v_stock_number'
set @strValues = @strValues + '''' + @v_city + ''', ''' + @v_state + ''', ''' + @v_zip_code + ''', ''' + @v_daytime_phone + ''', ''' + @v_contact_name + ''', '''
+ @v_email_address + ''', ' + cast(@u_id as varchar) + ', ' + cast(@d_id as varchar) + ', 1, ''' + cast(CURRENT_TIMESTAMP as varchar) + ''', 1 , ''' + @v_latitude + ''', ''' + @v_longitude + ''', '''
+ cast(CURRENT_TIMESTAMP as varchar) + ''', dft.df_t_id, (SELECT CASE WHEN dft.df_t_v_price <> 0 THEN dft.df_t_v_price WHEN dft.df_t_v_internet_price <> 0 THEN dft.df_t_v_internet_price WHEN dft.df_t_v_other_price <> 0 THEN dft.df_t_v_other_price ELSE 0 END AS v_search_price)'
-- Insert Records Into Vehicle Table (but not twice!) --
set @strSQL = 'INSERT INTO tbl_Vehicles (' + @strFields + ') SELECT ' + @strValues + ' FROM tbl_DealerFeed_temp dft ' + @strJoin + ' WHERE dft.df_t_processed = 0 AND dft.df_d_id = ' + cast(@df_d_id as varchar)
set @strSQL = @strSQL + ' AND dft.df_t_v_stock_number NOT IN ( SELECT v.v_stock_number FROM tbl_Vehicles v WHERE v.d_id = ' + cast(@d_id as varchar) + ')'
print @strSQL
EXEC (@strSQL)
你可以试试
''' + cast( @v_latitude as varchar(20))
+ ''', ''' + cast((@v_longitude as varchar(20))+ '''
在执行动态 SQL 时,您将所有内容都强制转换为字符串类型。
但是单引号让您感到困惑。如果您要插入的列是浮点数,则您不希望插入的浮点值用引号引起来。
我还发现 CONVERT
比 CAST
更灵活(主要是日期)(我只为多样性做了 CONVERT):
所以你想去掉那些三重引号:
...+ CONVERT(varchar(20), @v_latitude) +',' + CONVERT(varchar(20), @v_longitude) +...
编辑添加:您的固定代码应如下所示:
set @strValues = @strValues + '''' + @v_city + ''', ''' + @v_state + ''', ''' + @v_zip_code + ''', ''' + @v_daytime_phone + ''', ''' + @v_contact_name + ''', '''
+ @v_email_address + ''', ' + cast(@u_id as varchar) + ', ' + cast(@d_id as varchar) + ', 1, ''' + cast(CURRENT_TIMESTAMP as varchar) + ''', 1 , ' + Convert(varchar(20), @v_latitude) + ', ' + Convert(varchar(20), @v_longitude) + ', '''
+ cast(CURRENT_TIMESTAMP as varchar) + ''', dft.df_t_id, (SELECT CASE WHEN dft.df_t_v_price <> 0 THEN dft.df_t_v_price WHEN dft.df_t_v_internet_price <> 0 THEN dft.df_t_v_internet_price WHEN dft.df_t_v_other_price <> 0 THEN dft.df_t_v_other_price ELSE 0 END AS v_search_price)'
执行你的 SQL 没有 EXEC (@strSQL)
并查看打印的 SQL
再次编辑;修复您的 Float 被限制为四舍五入到小数点后 4 位(这是因为它是 Float)但是您可以通过先将其转换为小数或使用 STR
来绕过它,这将帮助您理解发生了什么:
declare @v_latitude float = -45.12345678
print @v_latitude
print 'Cast = '+ cast( @v_latitude as varchar)
print 'Convert = '+ convert(varchar(20), @v_latitude)
print 'Cast via decimal = '+ cast( cast(@v_latitude as decimal(18,9)) as varchar)
print 'Convert via decimal = '+ convert( varchar(20), convert(decimal(18,9), @v_latitude))
print 'str = '+ str(@v_latitude,18,9)
==
-45.1235
Cast = -45.1235
Convert = -45.1235
Cast via decimal = -45.123456780
Convert via decimal = -45.123456780
str = -45.123456780
问题可能是您的动态 sql 在浮点数两边加上了单引号。
尝试更改
, ''' + cast(@v_latitude as float) + ''', ''' + cast(@v_longitude as float) + ''', ..
进入
, ' + STR(@v_latitude,<length>,<decimals>) + ', ' + STR(@v_longitude,<length>,<decimals>) + ', ..
参考STR ()