2013-02-22 8 views
53

ho incontrato qualche problema con il server SQL, questa è la funzione che ho creato:La stringa oi dati binari verrebbero troncati. L'istruzione è stata terminata

ALTER FUNCTION [dbo].[testing1](@price int) 
RETURNS @trackingItems1 TABLE (
    item  nvarchar NULL, 
    warehouse nvarchar NULL, 
    price int NULL 
) 
AS 
BEGIN 
    INSERT INTO @trackingItems1(item, warehouse, price) 
    SELECT ta.item, ta.warehouse, ta.price 
    FROM stock ta 
    WHERE ta.price >= @price; 

    RETURN; 
END; 

Quando scrivo una query per utilizzare tale funzione come la seguente che ottenendo l'errore

La stringa oi dati binari verrebbero troncati. La dichiarazione è stata chiusa

Come risolverlo? Grazie

select * from testing1(2) 

Questo è il mio modo di creare la tabella

CREATE TABLE stock(item  nvarchar(50) NULL, 
        warehouse nvarchar(50) NULL, 
        price int NULL); 
+13

Significa semplicemente che si sta inserendo un valore superiore al valore massimo consentito. Ad esempio, una colonna può contenere solo fino a 5 caratteri, ma stai inserendo una stringa di 10 caratteri. –

+0

@JW ma nella mia tabella è incluso il valore 2 per il prezzo, e il tipo di dati è effettivamente lo stesso (es .: int) – user2098512

+0

Anche la modalità di chiamata è selezionare [dbo] .testing1 (2) da tablename – DevelopmentIsMyPassion

risposta

25

La lunghezza massima della colonna di destinazione è più breve del valore che si tenta di inserire.

Fare clic destro sulla tabella in Gestione SQL e andare su "Progettazione" per visualizzare la struttura della tabella e le definizioni delle colonne.

Edit:

cercare di impostare una lunghezza sui vostri inserti nvarchar Questo non è solo o più breve di che cosa è definito nella tabella.

+0

per me il problema era con la lunghezza della colonna, quindi passare da 'nvarchar (50)' a 'ntext' in sql sever, risolve il problema, spero che qualcuno aiuti – stom

+0

@stom si dovrebbe sempre cercare di usare la lunghezza più piccola possibile per il tuo dati. Così facendo mantieni le tue tabelle il più piccolo e veloce possibile e mostra anche l'intento. Se qualcuno ha bisogno di indicizzare o migrare il tuo database in pochi anni, dovrà scoprire perché le tabelle sono state progettate come sono. Detto questo, se vuoi un testo "illimitato" in un campo, ntext è una soluzione praticabile. – OakNinja

+0

grazie per il suggerimento dato sulla performance, in questo momento sto memorizzando i link ai siti web e alcuni sono lunghi, quindi ho scelto ntext. – stom

43

Quando si definisce varchar etc without a length, the default is 1.

Quando n non è specificato in una definizione di dati o una dichiarazione di dichiarazione delle variabili, la lunghezza predefinita è 1. Se n non è specificato con la funzione CAST, la lunghezza di default è 30.

Quindi, se vi aspettate 400 caratteri in @trackingItems1 colonna dalla stock, utilizzare nvarchar(400).

In caso contrario, si sta cercando di adattarsi> 1 carattere in nvarchar(1) = fallire

Come commento, questo è bad use of table value function anche perché è "multi affermazione". Può essere scritto come questo e verrà eseguito meglio

ALTER FUNCTION [dbo].[testing1](@price int) 
RETURNS 
AS 
    SELECT ta.item, ta.warehouse, ta.price 
    FROM stock ta 
    WHERE ta.price >= @price; 

Naturalmente, si potrebbe utilizzare una normale istruzione SELECT ..

5

specificare un formato per la oggetto e magazzino come nel [dbo].[Testing1] FUNCTION

@trackingItems1 TABLE (
item  nvarchar(25) NULL, -- 25 OR equal size of your item column 
warehouse nvarchar(25) NULL, -- same as above 
price int NULL 

) 

Poiché in MSSQL solo dicendo solo nvarchar è uguale a nvarchar (1) quindi i valori della colonna della tabella magazzino vengono troncati

+0

Grazie a tutti, ho risolto il mio problema ~~ duello al filtro antispam, non posso tutti qui – user2098512

6

Nel mio caso, è stato questo errore perché il mio tavolo aveva

varchar(50) 

ma ero iniettando stringa lunga 67 caratteri, che ha portato in thi errore. Cambiarlo in

varchar(255) 

risolto il problema.

+0

:) Cambiare in varchar (qualche_valore) ha risolto il mio problema. –

Problemi correlati