2017-05-19 3 views
1

Ich habe versucht, wie eine select-Anweisung mit Top-Wert im Parameter zu verwenden:Wählen Sie oben in SQL nvarchar statt int

CREATE PROCEDURE PROC_TOP @NUM INT AS 
DECLARE @SQL VARCHAR(255) = 'SELECT TOP ' + @NUM + ' * FROM MYTABLE;' 
BEGIN 
    EXEC sp_executesql @SQL 
END 

Es zurückkehren mir ein Fehler:

Conversion failed when converting the varchar value 'SELECT TOP ' to data type int.

Aber wenn ich von ändern int zu nvarchar seine Arbeit:

PROC_TOP @NUM nvarchar(50) 
DECLARE @SQL nvarchar(255) 

Meine Frage ist:

Warum akzeptiert Sql den Datentyp nvarchar anstelle von Int?

Antwort

2
DECLARE @SQL VARCHAR(255) = 'SELECT TOP ' + cast(@NUM as varchar(6)) + ' * FROM MYTABLE;' 
+0

implizit Datentyp-Konvertierung tun Diese Arbeit ist, wenn SQL VARCHAR ERKLÄREN (255) Änderung SQL NVARCHAR verzollen (255) .. danke - – redzsol

1

String-Verkettung mit + nicht Datentyp-Konvertierung tun, wenn Sie Concat es verwenden, wie unten

CREATE PROCEDURE PROC_TOP @NUM INT AS 
DECLARE @SQL VARCHAR(255) = concat('SELECT TOP ' , @NUM , ' * FROM MYTABLE;') 
BEGIN 
    EXEC sp_executesql @SQL 
END 
+0

Concat funktioniert nicht .. danke – redzsol

+0

Warum? Welche Version von SQL Server? –

+0

Ich benutze 2008 .. Ich habe Ihren Beitrag upvoted, aber ich denke, dass jemand darauf abgestimmt. – redzsol