【问题标题】:SQL execute string issue with National language character?SQL执行带有国家语言字符的字符串问题?
【发布时间】:2014-01-12 09:05:09
【问题描述】:

我在 sql 中有一个简单的 sp,如下所示:

    alter proc sptest(@val nvarchar(30))
    as

    select COUNT(*) from AAtable
    where name =  @val

当我用@val = 'مریم' 调用这个 sp 时,它运行良好并返回值。 但是当我像这样改变它时:

    alter proc sptest(@val nvarchar(30))
    as
    declare @q nvarchar(max)
    set @q = 'select COUNT(*) from AAtable where name = ' + @val

    Execute(@q)

并使用相同的@val 调用它,它会将@val 值转换为“?”并返回错误。我应该说@val 来自c# 中的字符串参数。据我所知.net 将字符串转换为 nvarchar 参数形式的 sql。无论如何,我不能在@val 之前添加 N。 而且我必须进行字符串查询并执行它,所以我也不能将其更改为第一个代码。

如果我这样做:set @q = 'select COUNT(*) from AAtable where name = N''' + @val + '''' 它也不起作用。

为什么执行字符串会使我的 nvarchar 参数变为“?” !?

【问题讨论】:

    标签: c# sql .net database database-design


    【解决方案1】:

    在文本前面添加 N,因此它是 NVARCHAR 文字,而不是 VARCHAR,如下所示:N'My Text'

    【讨论】:

    • 正如我所说的@val 来自 C#,我不能在它之前添加 N。并且 c# 也会自动完成。
    • 如果我这样做:set @q = 'select COUNT(*) from AAtable where name = N''' + @val + '''' 它也不起作用。
    • 在您的动态 sql 文字中,您必须添加 N。将此 set @q = 'select COUNT(*) from AAtable where name = ' + @val 更改为此 set @q = N'select COUNT(*) from AAtable where name = ' + @val跨度>
    • 当我尝试在 sql 窗口中使用该字符时它可以工作。您在 C# 中的数据访问代码是什么样的?您是否明确声明了参数的数据类型?
    • public int Getest(string Value) { using (IDataContext ctx = DataContext.Instance()) { var item = ctx.ExecuteScalar(System.Data.CommandType.StoredProcedure, "sptest",价值);归还物品; } } 从 textbox.text 设置的值参数。
    【解决方案2】:

    尝试将连接操作的第一个字符串标记为显式 Unicode:

    set @q = N'select COUNT(*) from AAtable where name = ' + @val
    

    这也应该让您的@val 保持 Unicode。

    【讨论】:

    • 不起作用!仍然返回这个:select COUNT(*) from AAtable where name = '????'
    【解决方案3】:
    ALTER proc sptest(@val nvarchar(30))
    AS
        DECLARE @retval INT
        DECLARE @SQLString nvarchar(500);
        DECLARE @ParmDefinition nvarchar(500);
    
        SET @SQLString =
             N'select @retvalOUT  = COUNT(*) from AAtable where name = @Name';
        SET @ParmDefinition = N'@Name varchar(30), retvalOUT int OUTPUT';
    
        EXECUTE sp_executesql @SQLString, @ParmDefinition,
                              @Name  = @val,
                              @retvalOUT=@retval OUTPUT;
        SELECT @retval;
    

    【讨论】:

    • 它什么也不返回,既不是值也不是错误。 @ParmDefinition 应该如何工作并分配给@name?
    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多