2016-12-04 6 views
2

У меня есть следующий фрагмент кода. Я не совсем понимаю, что результат имеет только первый оператор EXEC. Может кто поможет объяснить, пожалуйста?Оператор SQL Server LIKE с сопоставлением столбцов NCHAR

USE tempdb; 
GO 

IF OBJECT_ID('dbo.students') IS NOT NULL 
    DROP TABLE dbo.students; 
CREATE TABLE dbo.students 
(
    id INT NOT NULL IDENTITY PRIMARY KEY, 
    name NCHAR(10) 
); 

INSERT INTO dbo.students(name) 
SELECT c FROM(VALUES(N'ab'), (N'cd'), (N'ef'), (N'gh')) AS DATA(c); 

SELECT *, DATALENGTH(name)FROM dbo.students; 
GO 

IF OBJECT_ID(N'dbo.check_address') IS NULL 
BEGIN 
    EXEC('CREATE PROCEDURE dbo.check_address AS SELECT ''to be replaced'''); 
END; 
GO 

ALTER PROCEDURE dbo.check_address @name NCHAR(10) 
AS 
BEGIN 
    SELECT * FROM dbo.students WHERE name LIKE N'%' + @name + N'%'; 
END; 
GO 

EXEC check_address N'ab'; 
EXEC check_address N'a'; 
+0

@DavidG есть два ... один 'N'ab'', один' N'a'' –

+0

. Сначала я попытался попробовать с помощью 'nvarchar (10)' вместо 'nchar (10)' для как столбец, так и параметр –

+0

@MarcGravell Я действительно не должен стекать переполнение так поздно ночью! – DavidG

ответ

6

N'ab', как фиксированной ширины типа, как nchar(10), на самом деле N'ab '. Таким образом, он соответствует LIKE N'%ab %', но не соответствует LIKE N'%a %'.

Используйте nvarchar(10) вместо nchar(10) как для столбца, так и для параметра, и он должен работать так, как вы ожидаете.

+0

Но вторая инструкция exec в моем примере кода «% a%», а не «% a%», правильно? –

+0

@ Ogrish nope. Параметр «nchar (10)». Входные данные будут расширены до этого ** перед ** конкатенация с '%' происходит –

+0

О, D'oh! Я, наконец, понял это. Большое спасибо Марку! –