我在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参数变为“?” !?
答案 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;