1

我有一个带有nvarchar参数的存储过程。我想用OPENROWSET得到返回的表。但是当我使用如下代码的结果将是不正确OpenRowSet中的Unicode查询

Declare @ID int 
Declare @sql nvarchar(max) 
Declare @p1 nvarchar(8) 
Set @ID=1 
Set @sql='SELECT * 
FROM OPENROWSET(
    ''SQLNCLI'', 
    ''DRIVER={SQL Server};'', 
    ''EXEC dbo.usp_test @p1 =''''' + @p1 + ''''')' 
Exec(@sql) 

的OPENROWSET将我的查询转换为VARCHAR,不正确地执行我的程序。 似乎OPENROWSET执行我的代码是这样的:

exec dbo.usp_test @p1='????????' 

所以结果是不正确的。 OPENROWSET有没有选择来解决我的问题?

+0

'Set @ sql = N'SELECT * ....' - 这是否工作? – 2013-04-20 05:23:04

+0

nope。你的解决方案不起作用 – 2013-04-20 06:06:38

+2

@sheykholeslam:尝试'... @ p1 = N'''''+ ...' – 2013-04-20 19:02:29

回答

0

当您使用nvarchar数据,你需要你的字符串值前添加一个特定的字符(N)是这样的:

DECLARE @ID int 
DECLARE @sql nvarchar(max) 
DECLARE @p1 nvarchar(8) 
SET @ID=1 
SET @sql = N'SELECT * 
      FROM OPENROWSET(''SQLNCLI'', 
          ''DRIVER={SQL Server};'', 
          ''EXEC dbo.usp_test @p1 = N''' + @p1 + N''''')' 
EXEC(@sql) 

注:
当你有'''EXEC dbo.usp_test @p1 =''''' + 'p1' + ''''''等于'EXEC dbo.usp_test @p1 =''p1''这是错误的,应该为'''EXEC dbo.usp_test @p1 =''' + 'p1' + '''''''EXEC dbo.usp_test @p1 ='p1''