当前位置: 首页 > 面试题库 >

动态SQL错误将nvarchar转换为int

宋明亮
2023-03-14
问题内容

我已经在动态SQL中创建了一个过程,该过程具有一个select语句,并且代码如下所示:

ALTER PROCEDURE cagroup    (
    @DataID INT ,
    @days INT ,
    @GName VARCHAR(50) ,
    @T_ID INT ,
    @Act BIT ,
    @Key VARBINARY(16)
)
AS
BEGIN
    DECLARE @SQL NVARCHAR(MAX)
    DECLARE @SchemaName SYSNAME
    DECLARE @TableName SYSNAME
    DECLARE @DatabaseName SYSNAME
    DECLARE @BR CHAR(2)
    SET @BR = CHAR(13) + CHAR(10)

    SELECT  @SchemaName = Source_Schema ,
            @TableName = Source_Table ,
            @DatabaseName = Source_Database
    FROM    Source
    WHERE   ID = @DataID

SET @SQL =  'SELECT ' + @GName + ' AS GrName ,' + @BR
                + @T_ID + ' AS To_ID ,' + @BR
                + @DataID + ' AS DataSoID ,' + @BR
                + @Act + ' AS Active ,' + @BR
                + Key + ' AS key' + @BR
                + 'R_ID AS S_R_ID' + @BR
                + 'FROM' + @DatabaseName + '.'
                + @SchemaName + '.'
                + @TableName + ' t' + @BR
                + 'LEFT OUTER JOIN Gro g ON g.GName = '
                    + @GName + @BR + 'AND g.Data_ID] =' + @DataID + @BR
                    + 't.[I_DATE] > GETDATE() -' + @days + @BR
                    + 'g.GName IS NULL
                        AND ' + @GName + ' IS NOT NULL
                        AND t.[Act] = 1' + @BR

    PRINT (@SQL)
END

当我使用以下语句执行此过程时:

Exec  dbo.cagroup  1,10,'[Gro]',1,1,NULL

我收到以下错误。

消息245,级别16,状态1,procedurecagroup,第33行将nvarchar值’SELECT [Gro] AS
GName,’转换为数据类型int时,转换失败。

我在哪里做错了?


问题答案:

您需要在串联中将所有数字CAST转换为nvarchar。

没有隐式的VBA样式转换为字符串。在SQL Server中,数据类型优先级意味着int高于nvarchar:因此,整个字符串都试图通过CAST转换为int。

SET @SQL =  'SELECT ' + @GName + ' AS GrName ,' + @BR
              + CAST(@T_ID AS nvarchar(10)) + ' AS To_ID ,' ...

编辑:请问A有一个好点:注意NULL!



 类似资料:
  • 问题内容: 我想将一个表的所有行插入另一个表,并且还希望将一个字段转换为,但是当我使用SQL Server时显示错误: 将数据类型nvarchar转换为bigint时出错 我该如何解决这个问题? 问题答案: 您可以尝试使用以确定确实是数字的那些行: 那将转换那些可以转换的行-其他行需要手动处理。

  • Microsoft SQL Server,数据库中的列定义为NVARCHAR,但在Java代码中定义为。 Hibernate失败,验证错误如下: 原因:org.hibernate.tool.schema.spi.schemaManagementException:模式验证:在表[Table_Name]中的列[Column_Name]中遇到错误的列类型;找到[nvarchar(types#nvarc

  • 问题内容: 我在代码隐藏中收到转换失败的错误。我的代码如下: 我收到以下错误: 将nvarchar值转换为数据类型int时,转换失败。 在这里必须进行哪些更改? 问题答案: 我想这是一个整数,但您正在分配一个字符串。因此,这可能会解决它: 编辑:由于您已评论该会话存储了用户名,但该列是一个int列,因此您有三个选择: 更改会话以存储用户标识而不是名称 更改列以存储用户名 从存储用户名的表中选择用户

  • 要求:在移动设备上查看基于XFA的PDF。 我尝试过的选项: 由于Adobe移动阅读器不支持XFA,因此我可以将XFA展平为静态PDF。我尝试过,但无法使用iText将动态XFA转换为静态PDF。 后来我尝试使用“Adobe PDF”作为打印服务打印XFA表单。这在手动执行时可以正常工作,但在通过代码执行时会以某种方式清除表单数据。 下面是打印任务的示例代码。已为“Adobe PDF”打印服务安装

  • 问题内容: 我已经搜索了这个很棒的论坛并在Google周围搜索,但无法解决。 我们有两个表(相信我,我与这些表无关)。这两个表都有一个名为的列。 然而,在一个表中,数据类型就是和在另一个表中,这是。 我们从选择这里被定义为和保存该ID写入其中被定义为。 作为数据类型descrepancy的结果,我们得到错误转换数据类型来。 在不弄乱数据库的情况下,我想强制使用摆脱该错误。 有什么想法我在下面的代码

  • 问题内容: 将float转换为int时如何避免浮点错误。例如,下面的代码打印出来:当我受伤时,期望它打印出来。 问题答案: 您需要了解一些内容:是一个十进制数字(以十进制基数表示)。十进制中的是一个有限数字,正好是:。 通常,计算机以二进制表示形式存储数字。该数字不能用有限的二进制数表示:是以二进制表示的 无限 数(同样的原因为什么不能用有限的十进制数表示,它是一个无穷的序列:)。 但是Go(像其