SQL执行字符串问题与国家语言字符?

时间:2013-12-24 05:46:12

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

我在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. 而且我还需要进行字符串查询并执行它,所以我也无法将其更改为第一个代码。

如果我这样做:设置@q ='从AAtable中选择COUNT(*),其中name = N'''+ @val +''''它也不起作用。

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

这也应该使您的@val保持在Unicode中。

答案 2 :(得分:0)

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;